*Alex*: strpos(RegEx)

Hallo Leute

Irgendwie kommt mir meine Frage doof vor, aber ich finde einfach nicht die PHP-Funktion die ich brauche:

Ich will in einem String von bis zu 5Mio Zeichen (Messreihen) das erste Vorkommen einer Zeitmessung des Formats hh.mm.ss.ttt finden. Meine RegEx dazu muss glaube ich $Regex="/[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{3}/"; heißen.

Aber mit welcher Funktion rufe ich sie auf?

strpos() macht keine RegEx
preg_mach()und ereg() suchen nicht die Position, sondern OB die RegEx vorkommt, bzw. basteln mir unnötigerweise Arrays und das Schlimmste: sie arbeiten den ganzen haystack ab (das dauert!!!) was völlig sinnlos ist, da das erste Vorkommen regelmäßig sehr früh ist.

Wie kriege ich die POSITION des ERSTEN Vorkommens einer RegEx in einem String in PHP???

Vielen lieben Dank - es ist bestimmt furchtbar einfach, aber ich finds nicht.

*Alex*

  1. gudn tach!

    Ich will in einem String von bis zu 5Mio Zeichen (Messreihen) das erste Vorkommen einer Zeitmessung des Formats hh.mm.ss.ttt finden. Meine RegEx dazu muss glaube ich $Regex="/[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{3}/"; heißen.

    ja, oder etwas kuerzer (aber afais nicht schneller):
      /(?:[0-9]{2}.){3}[0-9]{3}/

    Aber mit welcher Funktion rufe ich sie auf?

    in perl waere das mit "pos" schnell erledigt. in php ist es etwas aufwendiger.

    if(preg_match($re, $str, $gefunden, PREG_OFFSET_CAPTURE))  
      echo $gefunden[1];
    

    steht auch im manual: http://www.php.net/manual/en/function.preg-match.php

    preg_mach()und ereg() suchen nicht die Position, sondern OB die RegEx vorkommt, bzw. basteln mir unnötigerweise Arrays und das Schlimmste: sie arbeiten den ganzen haystack ab (das dauert!!!) was völlig sinnlos ist, da das erste Vorkommen regelmäßig sehr früh ist.

    huch, afaik bricht preg_match nach dem ersten vorkommen ab. bist du sicher, dass es bei nicht so ist?

    prost
    seth

  2. Hello,

    Irgendwie kommt mir meine Frage doof vor, aber ich finde einfach nicht die PHP-Funktion die ich brauche:

    Ich will in einem String von bis zu 5Mio Zeichen (Messreihen) das erste Vorkommen einer Zeitmessung des Formats hh.mm.ss.ttt finden. Meine RegEx dazu muss glaube ich $Regex="/[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{3}/"; heißen.

    Aber mit welcher Funktion rufe ich sie auf?

    strpos() macht keine RegEx
    preg_mach()und ereg() suchen nicht die Position, sondern OB die RegEx vorkommt,

    http://de.php.net/manual/de/function.preg-match.php
    siehe Optionsschalter mit  PREG_OFFSET_CAPTURE

    Preg_match_all() benutze ich immer, um aus Webseiten HMTL-Mails mit embedded Pictures zu machen.
    daher weiß ich, dass das das richtige für Dich wäre  ... :-)

    Aber es gibt eine Beschränkung der P-Reg-Funktionen, was die Größe des zu durchsuchenden Blockes betrifft. Ich habe zwar vergessen, wo die lag, bin mir aber ziemlich sicher, dass Du bei 5MByte da in der Problemzone bist.

    bzw. basteln mir unnötigerweise Arrays und das Schlimmste: sie arbeiten den ganzen haystack ab (das dauert!!!) was völlig sinnlos ist, da das erste Vorkommen regelmäßig sehr früh ist.

    Du suchst mal nach den Limitationen von preg_match und preg_match_all.
    Wenn ich mich da geeirt habe, nutzt Du sie so, wie sie sind. Fertig!

    Wenn bicht, dann zerschneidest Du die zu durchsuchende Menge _überlappend_ in einzelne Blöcke. Die Überlappung muss mindestens so lang sein, wie das gesuchte Pattern.

    Also duchsuchen Block 1 von 0 bis 52.000 Bytes
                    Block 2 von 50.000 bis 102.000 Bytes
                    Block 3 von 100.000 bis 152.000 Bytes
                    usw.

    Die Grenzen natürlich nur als Beispiel.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)