Reguläre Ausdrücke/Teil 1

Aus php bar
Wechseln zu: Navigation, Suche

Teil 1: Reguläre Ausdrücke

Wie bereits angesprochen werden RegEx zum Suchen von Zeichenketten innerhalb anderer Zeichenketten verwendet. Für die Beispiele werde ich der Einfachheit halber die Funktionen ereg() und ereg_replace() verwenden. Ereg() durchsucht eine Zeichenkette anhand der gegebenen RegEx-Suche und gibt entweder true oder false zurück, je nachdem ob die Suche zutrifft oder nicht. Die einfachste Suche (das einfachste Suchmuster) wäre eine einfache Zeichenkette:

1 $string = 'Dies ist ein Text.''Text'"'Text' wurde gefunden!""'Text' wurde nicht gefunden!";
2 }
3 
4 // "Text" wird gefunden und die entsprechende Meldung ausgegeben
5 


Dabei soll es aber lange nicht bleiben; Was wenn nicht nur nach dem Vorkommen eines bestimmten Wortes gesucht werden soll, sondern ob es Beispielsweise am Anfang oder am Ende des Strings steht? Dafür gibt es die Metacharaktere.

Metacharaktere

  • ein ^ gibt an dass eine Suche mit einem bestimmten String beginnen soll
  • ein $ gibt an dass eine Suche mit einem bestimmten String enden soll

Beispiel:

1 ereg("^Spiel", $string);

findet "Spiel" als auch "Spieler", "Spielfeld", "Spielgemeinschaft", oder alles andere was mit "Spiel" beginnt. "Freundschaftsspiel" oder "Actionspiel" werden nicht gefunden. Ebenso findet

1 ereg("Spiel$", $string);

"FreundschaftsSpiel" oder "Dies ist ein Spiel" (weil Spiel am Ende des Strings steht) aber nicht "Spiel mit!"


  • Der "." steht bei RegEx für ein beliebiges Zeichen (Wildcard)

Einer der nützlichsten Charaktere bei RegEx, wir werden ihn immer wieder verwenden. Beispiel:

1 ereg("Abschnitt .", $string);

findet "Abschnitt a", "Abschnitt b", "Abschnitt c", aber auch "Abschnitt §" und andere komische Werte.


Wichtig: Wenn ihr einen einfachen Punkt schreiben/suchen wollt, müsst ihr den Punkt (so wie alle anderen RegEx Sonderzeichen) mit einem Backslash ("\") escapen. Beispiel:

1 ereg("Ich suche diesen Satz\.", $string);


Ein weiterer wichtiger Metacharakter ist die vertikale linie "|". Er steht für ein "oder". Beispiel:

1 ereg("gehen|rennen", $string);
2 //findet entweder "gehen" oder "rennen"
3 


Quantifier

Quantifier sind sehr praktisch und werden bei anspruchsvolleren RegEx immer wieder zum Einsatz kommen.

  • ein * bedeutet null oder mehr vorkommen
  • ein + bedeutet ein oder mehr vorkommen
  • ein ? bedeutet ein oder null vorkommen

Beispiele:

1 ereg("123*", $string);
2 // findet "12", "123", "1233333", oder "1233333333333333333" [bis unedlich]
3 

1 ereg("123+", $string);
2 // findet "123", "1233333", oder "1233333333333333333" [bis unedlich]
3 

1 ereg("123?", $string);
2 // findet "12" oder "123"
3 


Dies lässt sich natürlich auch Beliebig kombinieren: "^1?2+3*$" würde folgendes zulassen: Das Ergebnis kann mit einer eins anfangen, muss aber nicht. Danach kommt eine bis unendlich viele 2en. Das 3*$ sagt dass das Suchergebnis mit beliebig vielen 3en zu enden hat, also möglicherweise auch keiner.

Wenn man will das nicht nur ein Zeichen sondern eine ganze Zeichenkette von dieser Wiederholung beeinflusst wird, kann man die runden Klammern ( und ) benutzen, Beispiel: "Ich mag php::bar (,?viel )*mehr" kann "Ich mag Piranho viel mehr" aber auch "Ich mag Piranho viel, viel, viel, viel mehr" ergeben.

Damit sind die Wiederholungsmöglichkeiten aber noch nicht am Ende. Wenn man nur eine bestimmte Wiederholungsanzahl erreichen möchte, kann man geschweifte Klammern { und } (ebenfalls Quantifier genannt) benutzen. Mit nur einer Zahl zwischen den Klammern bewirkt man eine bestimmte Anzahl Wiederholungen, Bsp:

1 ereg("ab{5}", $string);
2 //findet genau "abbbbb".
3 

Zwei Zahlen, getrennt durch Komma an, bewirken eine von-bis Suche, Bsp:

1 ereg("ab{2,5}", $string);
2 //findet "abb", "abbb", "abbbb", oder "abbbbb".
3 

Wenn man das Komma, aber keinen Maximalwert eingibt, ist der Maximalwert unendlich. Beispiel:

1 ereg("ab{1,}", $string);
2 //findet "ab", "abbbb", "abbbbbbbbbbbb" u.s.w.
3 


Genauso wie die Operatoren *, ?, und + kann man diese Widerholungen auch auf Gruppen anwenden. Beispiel:

1 ereg("a(bc){1,3}", $string);
2 //findet "abc", "abcbc", oder "abcbcbc"
3 


Wir haben bis jetzt die Klammern () und {} kennengelernt. Jetzt kommen die eckigen Klammern [ und ]: Mit ihnen kann man beliebige Zeichen angeben, die an genau einer Position sein können. So wie ein "." (Punkt), nur spezifischer. Zum verdeutlichen ein paar Beispiele:

1 ereg("[a-z]", $string);
2 // lässt genau 1 kleingeschriebenen(!) Buchstaben zu,
3 // das "- "steht hierbei als "bis"-Operator (klein-a bis klein-z).
4 

1 ereg("[ab]", $string);
2 // entweder a oder b.
3 

1 ereg("^[a-zA-Z]", $string);
2 //ein String der mit einem Buchstaben beginnt.
3 


Innerhalb eckiger Klammern (und auschließlich innerhalb dieser) gibt es eine Spezielle Syntax; Für Zeichen, hintereinander geschrieben, gilt automatsch oder "[ab]" findet "a" oder "b". Ein "-" gilt als "bis"-Zeichen, [a-z] findet alle kleingeschriebenen Buchstaben aus dem englischen Alphabet. Ein "^" am Anfang innerhalb der Klammern kehrt hier die Selektion um. "[^0-9]" findet alle Zeichen außer Zahlen!


Gruppen

Gruppen sind die Strings die innerhalb von runden Klammern ( und ) stehen. Sie sind von daher von Bedeutung da man sie durch \\x wieder zurückgeben kann, dies ist besonders praktisch bei replace-Funktionen. Das x steht dabei für die Nummer der Gruppe die mit 1 (für die erste im Muster vorkommende Gruppe) beginnt, und bis zur 9ten Gruppe gezählt werden kann. \\0 enthält den gesamten Suchstring. Das \\x (genannt Backrefrence) kann sowohl im Suchmuster selbst aber auch bei replace-Funktionen im Replace-String vorkommen. Beispiele:

1 ereg("('|\")Text\\1", $string);
2 // findet "Text" als auch 'Text'
3 

1 span class="st0">"[b](.+)[/b]", "<b>\\1</b>", $string);
2 // Ersetzt "[b]Text[/b]" durch "<b>Text</b>"
3