strpos(RegEx)
*Alex*
- php
0 seth_not@home0 Tom
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*
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
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