Frage zu reg exp
jives 12.11.2002 - 16:55 546 9
jives
And the science gets done
|
Was hat dieses Suchmuster für einen Sinn? '#\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}#is'
Also im Allgemeinen sucht das Trum nach beliebigem Text der zwischen {} steht und Leerzeichen und Punkte beinhalten kann, soweit ich das kapiert hab. Was mich aber verwirrt ist das '+?'. '[a-z0-9]+' sucht zb nach beliebig vielen Buchstaben oder Zahlen. Nur was ändert sich bei '[a-z0-9]+?'? Sind das dann beliebig viele oder keine?
Und was machen '#' und '#is' am Anfang bzw. am Ende?
|
Ringding
Pilot
|
+ heißt einmal oder öfter. Zur Vollständigkeit: ? einmal oder keinmal * beliebig oft # sind einfach die Begrenzer, so wie normalerweise / Die Modifiers i und s musst nachschauen. i ist case insensitive, hätt ich gesagt, aber ich weiß jetzt nicht sicher. Schau nach und informier mich
|
jives
And the science gets done
|
Ok, ich schau was ich finden kann Dass + einmal oder öfter ist weiß ich, war auch nicht die Frage Ich wollt wissen was dass ? in '+?' für einen Sinn hat.
|
Ringding
Pilot
|
Ah sorry. Seh ich erst jetzt. Hmm, weiß ich auch nicht.
|
jives
And the science gets done
|
Modifier: i Dies ist der wohl am meisten gebrauchte Modifier. Bei regulären Ausdrücken wird standardmäßig zwischen Groß- und Kleinschreibung unterschieden - dieser Modifier schaltet dies aus. s Der s-Modifier veranlasst den Parser dazu, die Zeichenkette, auf die der reguläre Ausdruck angewendet wird, in einzelne Zeilen zu unterteilen - das Pattern wird hierbei also nicht auf die ganze Zeichenkette bezogen, sondern jede Zeile einzeln behandelt m Der m-Modifier ist das Komplement zum s-Modifier: Die Zeichenkette wird nicht in Zeilen aufgetrennt, sondern im Ganzen behandelt. Quelle: http://www.devmag.net/webprog/regulaere_ausdruecke.htmWas +? mach weiß ich immer noch nicht. Hab bis jetzt nur gefunden, dass es eignetlich nicht vorkommen darf EDIT: Die Page da oben ist ganz nett Habs endlich gefunden: Standardmäßig versuchen die Quantifier, auf einen so großen Text wie möglich zu passen. Dies kann zu Problemen führen: Angenommen es liegt eine Zeichenkette $str = "[b_]text[/b_]text[b_]text[/b_]" vor, und wir möchten daraus "<b>text</b>text<b>text</b>" machen. Versuchen wir es folgendermaßen:
$str = preg_replace("!\[b\](.*)\[/b\]!","<b>text</b>",$str);
so erhalten wir als Ergebnis "<b>text[/b]text[b]text</b>" - nicht ganz das, was wir wollten. Um dieses Verhalten abzustellen, setzen wir hinter den Quantifier ein Fragezeichen "?":
$str = preg_replace("!\[b\](.*?)\[/b\]!","<b>text</b>",$str);
und das gewünschte Ergebnis ist erreicht!
Bearbeitet von jives am 12.11.2002, 21:45
|
Ringding
Pilot
|
Aso, da gibt's auch einen globalen Modifier dafür, den Greediness Modifier.
|
M.I.P.S.
Big d00d
|
+? ließt man einfach von links nach rechts. + heißt, der Ausdruck kann 1 oder mehrere male vorkommen ? heißt der Ausdruck kann 1 mal oder gar nicht vorkommen. Wenn man das kombiniert, heißt das, der []-Ausdruck kann man 1 oder mehrere male nehmen und diesen wiederum 0 oder 1 mal. Somit ist +? äquivalent zu *. (Würd ich mal sagen) Wenn du dir das ganze in Form von einem Syntxdiagramm ansiehst ist es eigentlich ganz logisch.
|
jives
And the science gets done
|
Ja. As Ringding said, ein Greediness Modifier. Nur halt nicht global Ist allerdings != "*.", da "." für ein Zeichen steht, aber kein Quantifier ist - imho.
|
M.I.P.S.
Big d00d
|
Ähm, der "." war als Satzzeichen gemeint und nicht zu "*" gehörend...
|
watchout
Legendundead
|
Ähm, der "." war als Satzzeichen gemeint und nicht zu "*" gehörend... dann musst du ihn aber escapen - sprich \.
|