"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Frage zu reg exp

jives 12.11.2002 - 16:55 546 9
Posts

jives

And the science gets done
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
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
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
+ 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
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
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
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Ah sorry. Seh ich erst jetzt. Hmm, weiß ich auch nicht.

jives

And the science gets done
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
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.htm

Was +? mach weiß ich immer noch nicht. Hab bis jetzt nur gefunden, dass es eignetlich nicht vorkommen darf :bash:

EDIT: Die Page da oben ist ganz nett :) Habs endlich gefunden:
Zitat
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
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Aso, da gibt's auch einen globalen Modifier dafür, den Greediness Modifier.

M.I.P.S.

Big d00d
Avatar
Registered: Mar 2002
Location: On the inside
Posts: 324
+? 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
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
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
Avatar
Registered: Mar 2002
Location: On the inside
Posts: 324
Ähm, der "." war als Satzzeichen gemeint und nicht zu "*" gehörend... :)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von M.I.P.S.
Ähm, der "." war als Satzzeichen gemeint und nicht zu "*" gehörend... :)
dann musst du ihn aber escapen - sprich \.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz