Teil von  SELFPHP   Teil von  Praxisbuch  Teil von  Reguläre Ausdrücke
Letztes Update: 16.08.2005 17:53:45


Navigation

Seite News *

Seite Startseite
Seite Über SELFPHP
Seite Werbung
Seite Kontakt
Seite Forum *
Seite PHP-Skripte
Seite PHP Befehlsreferenz
Seite PHP5 Praxisbuch
Seite Gratis-Videolektionen*
Seite Download *
Seite SELFPHP Banner *
Seite SELFPHP in Buchform
Seite Newsletter *
Seite Impressum

Seite Anbieterverzeichnis

 
* Link führt ins Internet


Anbieterverzeichnis
Informieren Sie sich über die Unternehmen in unserem Anbieterverzeichnis!  

 


SELFPHP Forum
Fragen rund um die Themen PHP? In über 79.000 Beiträgen finden Sie sicher die passende Antwort!*  


Newsletter
Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!*

Vorname: 
Name:
E-Mail:
 



 

Ergänzungen zu reguläre Ausdrücke




In diesem Abschnitt haben wir einige zusätzliche Informationen zum Thema reguläre Ausdrücke für Sie zusammengefasst.


Perl-kompatible Funktionen

Sollte das Modul PCRE (Perl Compatible Regular Expressions) aktiviert sein, können anstelle der Funktionen der ereg-Bibliothek die Funktionen der Perl-kompatiblen preg-Bibliothek verwendet werden.

Die Funktionen dieser Bibliothek sind schneller und flexibler als die der ereg-Funktionen, da sie wesentlich effizienter in der Verarbeitung von regulären Ausdrücken sind.

Funktion Beispiel Beschreibung
preg_match ($reg_exp, $str [, $matches]) $res = preg_match("/test/", $str) Durchsucht eine Zeichenkette $str, auf ein Suchmuster $reg_exp und speichert die erste Fundstelle in $matches.
preg_match_all ($reg_exp, $str, $matches [, order]) $res = preg_match_allpreg_match("/test/", $str) Durchsucht eine Zeichenkette $str, auf ein Suchmuster $reg_exp und speichert sämtliche Fundstellen in $matches. Optional kann noch die Ordnung order angegeben werden.
preg_replace ($reg_exp, $rep, $str, [, limit]) echo preg_replace("/\s|,/","-",$str) Diese Funktion durchsucht $str nach Übereinstimmungen mit $reg_exp und ersetzt dann den übereinstimmenden Text durch $rep. Optional kann noch die Anzahl limit der Ersetzungen angegeben werden.
preg_replace_callback($reg_exp, $callback, $str [, limit]) echo preg_replace("/\s|,/","meinfunk",$str) Diese Funktion durchsucht $str nach Übereinstimmungen mit $reg_exp und ersetzt dann den übereinstimmenden Text mit Hilfe der innerhalb der callback-Funktion $callback festgelegten Vorgaben. Optional kann noch die Anzahl limit der Ersetzungen angegeben werden.
preg_split($reg_exp, $str [, limit [ flags]]) $array = preg_split("/(?= [a-z])/",$str) Gibt ein Array mit Zeichenketten zurück, die jeweils eine Teilzeichenkette von $str sind. Diese Teilzeichenketten entstehen durch Zerlegung von $str an den durch $reg_exp des Groß- und Kleinschreibung berücksichtigenden regulären Ausdrucks bestimmten Stellen. Wenn limit gesetzt wurde, enthält das zurückgegebene Array höchstens limit Elemente, von denen das letzte den Rest von $str enthält. Bei Auftreten eines Fehlers gibt die Funktion FALSE zurück. Der optionale Parameter flags steuert das Verhalten der Funktion.
preg_quote ($str [, delimiter]) $str1 = preg_quote($str); Setzt einen Backslash vor Sonderzeichen. Optional kann mit Hilfe des Parameter delimiter das Trennzeichen festgelegt werden.
preg_grep($reg_exp, $array) $array1 = preg_grep("/^/",$array); Durchsucht ein Array $array und filtert die enthaltenen Elemente des Arrays mit Hilfe des regulären Ausdrucks $reg_exp.


Die Syntax der Perl-kompatiblen regulären Ausdrücke orientiert sich an der Syntax von Perl 5.005.


Begrenzung der Suchmuster

Die Suchmuster sind zwischen Begrenzungszeichen / / einzuschliessen. Als Begrenzungszeichen sind mit Ausnahme von alphanumerischen Zeichen und dem Backlash (\) alle Zeichen erlaubt. Wenn das gewählte Begrenzungszeichen im Ausdruck selbst benötigt wird, muss mit einem vorangestellten Backslach gekennzeichnet werden.


Einsatz von Zeichenbereiche [ ]

Innerhalb eines Zeichenbereich verlieren die meisten Metazeichen ihre Bedeutung und werden als normale Zeichen interpretiert. Eine handvoll Metazeichen muss jedoch berücksichtigt und gegebenenfalls escaped oder anders angeordnet werden.

- (Minuszeichen) - Wird als Zeichen für den Bereich verwendet. Möchten Sie dies als normales Zeichen verwenden, so ordnen Sie es am Anfang oder am Ende der Zeichenklasse an ,[-ab] bzw. [ab-], oder escapen Sie es mit \-.

[ (offene eckige Klammer) - Enthält Ihr Zeichenbereich eine offene eckige Klammer, so notieren Sie diese am Ende des Zeichenbereichs aber vor dem Minuszeichen oder escapen Sie das Zeichen mit \ [.

] (schliessende eckige Klammer) - Enthält Ihr Zeichenbereich eine geschlossene eckige Klammer, so notieren Sie diese am Anfang des Zeichenbereichs oder escapen Sie das Zeichen mit \ ].

\ (Backslash) - Enthält Ihr Zeichenbereich einen Backslash, so escapen Sie diesen mit \.

/ (Slash) - Enthält Ihr Zeichenbereich einen Slash, so escapen Sie diesen mit \/.

^ (Dachzeichen) - Enthält Ihr Zeichenbereich ein Dachzeichen, so escapen Sie dieses mit \^.

Wollen Sie eine Auswahlnegation erhalten, d.h., die in dem Zeichenbereich genannten Zeichen dürfen nicht innerhalb der Zeichenfolge vorkommen, dann beginnen Sie Ihren Zeichenbereich mit ^. Das Suchmuster /[^äöüÄÖÜ]/ findet beispielsweise ein Zeichen, dass kein Umlaut ist.


Metazeichen

Zur Konstruktion der regulären Ausdrücke sind folgende Metazeichen definiert:

Zeichen Bedeutung
\ Nimmt dem nachfolgenden nichtalphanumerischen Zeichen die Sonderfunktion.
^ Anfang der Zeile oder des Textes.
. Beliebiges Zeichen ausser dem Zeilentrenner.
$ Zeilentrenner oder Ende des Textes.
| Alternative.
( ) Gruppierung.
[ ] Zeichenbereich (Zeichenklasse).



Quantifikatoren

Zusätzlich stehen die folgenden Quantifikationen zur Verfügung:

Quantifikator Bedeutung
* Garnicht bis beliebig oft. Enspricht {0, }
+ Mindestens einmal, ansonsten beliebig oft. Entspricht {1, }
? Garnicht oder 1-mal. Enspricht {0,1}
{n} Genau n-mal.
{n,} Mindestens n-mal.
{n,m} Zwischen n- und m-mal.



Liste der Metazeichen

Die folgende Tabelle enthält eine Übersicht über die gebräuchlichsten Metazeichen und Ihrer Bedeutung. In der Spalte "Escape" ist angegeben, wie Sie das Zeichen escapen können.

Zeichen Escape Bedeutung
^ \^ Findet ein Zeichen oder eine Zeichenfolge am Anfang, am Anfang eines Zeichenbereichs steht es für eine Negation.
$ $ Findet ein Teilsuchmuster am Ende einer Zeichenkette.
| \| Alternative, Oder-Auswahl zwischen zwei Teilsuchmustern bzw. Zeichen.
[] \[ \] Zeichenbereich bzw. Zeichenklasse, die Meisten Metazeichen sind ohne Bedeutung.
[^] Auswahlnegation, die Zeichen des Zeichenbereichs dürfen nicht enthalten sein.
- \- Bereich, nur innerhalb eines Zeichenbereichs, als normales Zeichen am Ende oder Anfang des Zeichenbereichs setzen.
() \( \) Gruppierung. Gruppiert Teilsuchmuster und speichert diese intern.
* \* Das Teilsuchmuster kann gar nicht bis beliebig oft vorkommen.
+ \+ Das Teilsuchmuster kommt mindestens einmal oder ansonsten beliebig oft vor.
? \? Das Teilsuchmuster kommt gar nicht oder 1-mal vor.
. \. Platzhalter (Wildcard) für genau ein beliebiges Zeichen ausser dem Zeilenumbruch \n.
.* Platzhalter (Wildcard) für einen beliebigen Text.
{n} \{ \} Das Teilsuchmuster soll genau n mal vorkommen.
{n, } Das Teilsuchmuster soll mindestens n mal vorkommen.
{n, m} Das Teilsuchmuster soll zwischen mindestens n- und maximal m-mal vorkommen.
\ \ Escaped ein Metazeichen. Soll der Backslash als normales Zeichen interpretiert werden, ist ein doppelter Backslash \ zu verwenden.
\symbol In Verbindung mit Buchstaben oder Zahlen mit unterschiedlicher Bedeutung.



Symbole für einzelne Zeichenklassen

Bei der Arbeit mit Perl-kompatiblen regulären Ausdrücken können Sie auf diverse Symbole zurückgreifen, die für einzelne Zeichenbereiche stehen. Die wesentlichen Symbole sind in der folgenden Tabelle zusammengestellt:

Symbol Entsprechung Bedeutung
\t Tab Tabulatorzeichen
\r Carriage return Wagenrücklauf
\n Newline Zeilenumbruch
\f Formfeed Seitenumbruch
\d [0-9] Ziffer
\D [^0-9] Jedes Zeichen das keine Ziffer ist.
\s [\t\r\n\f] Leerzeichen (Whitespace)
\S [^\t\r\n\f] Jedes Zeichen das kein Leerzeichen (Whitespace) ist.
\w [a-zA-Z_0-9] Buchstaben, Ziffern und Unterstrich
\W [^a-zA-Z_0-9] Alles was kein Buchstabe, Ziffer oder Unterstrich ist.
\b Wortbegrenzung, vor bzw. nach dem Muster befindet sich ein Leerzeichen (Whitespace).
\B Keine Wortbegrenzung, vor bzw. nach dem Muster befindet sich kein Leerzeichen (Whitespace).
\A Musteranfang oder Zeilenanfang, unabhängig vom Mehrzeilenmodus.
\Z Musterende oder Zeilenende, unabhängig vom Mehrzeilenmodus.
\z Musterende



Optionen des PCRE-Moduls

Im Anschluss an ein in Trennzeichen eingeschlossenes Muster können diverse Optionen, die die Funktion der Muster beeinflussen, angegeben werden. Diese sind in der folgenden Tabelle aufgelistet:

Option Interner PCRE-Name Bedeutung
i PCRE_CASELESS Wenn diese Option gesetzt wurde, wird Gross- und Kleinschreibung nicht berücksichtigt.
m PCRE_MULTILINE Wenn diese Option gesetzt wurde, gilt jeder Zeilenanfang und jedes Zeilenende als Start und Ende für das Suchmuster. Auf Zeichenketten, die keine \n enthalten, hat dies keinen Einfluss.
s PCRE_DOTALL Wenn diese Option gesetzt wurde, ersetzt der Punkt sämtliche Zeichen einschliesslich \n.
x PCRE_ EXTENDED Wenn diese Option gesetzt wurde, werden Leerzeichen, Tabulatoren und Zeilenumbrüche nicht beachtet.
e - Wenn diese Option gesetzt wurde, wird die Ersatzzeichenkette von preg_replace() als PHP-Code interpretiert.
A PCRE_ANCHORED Wenn diese Option gesetzt wurde, wird die Suche auf den Anfang der Zeichenkette eingeschränkt.
D PCRE_DOLLAR_ENDONLY Wenn diese Option gesetzt wurde, wird die Suche auf das Ende der Zeichenkette eingeschränkt.
S - Wenn diese Option gesetzt wurde, wird die Ausführung bei Mehrfachverwendung eines Suchmusters durch Zwischenspeicherung beschleunigt.
U PCRE_UNGREEDY Wenn diese Option gesetzt wurde, wird die Arbeitsweise des Suchmusters bei Mehrfachauswahl festgelegt und invertiert die "Gierigkeit" des Wiederholungsoperators.
X PCRE_EXTRA Wenn diese Option gesetzt wurde, werden zusätzliche Perl-kompatible Funktionen freigeschaltet.
u PCRE_UTF8 Wenn diese Option gesetzt wurde, werden Suchmuster als UTF8 codierte Zeichenketten interpretiert.



Beliebiges Zeichen oder beliebiger Text

Sie haben bereits erfahren das der Punkt für ein beliebiges einzelnes Zeichen in der Zeichenfolge steht. Wie wäre es mit folgendem Suchmuster /<.>/, welches Zeichenfolgen wie z.B. <u>, <1>, etc. ermittelt.


<?php
// Zeichen
$htmltext "<u>";
$reg_muster "/<.>/";
// Ausgabe (1)
echo preg_match($reg_muster,$htmltext);
?>



Soll es ein belibieger Text sein, können Sie beispielsweise folgendes Suchmuster //iU einsetzen. Es findet einen öffnenden Body-Tag in einem HTML-Quelltext.


<?php
// Zeichen
$htmltext "<body>Hallo Welt!</body>";
$reg_muster "/<body.*>/iU";
// Ausgabe (1)
echo preg_match($reg_muster,$htmltext);
?>



Wie wäre es mit dem Einsatz des Fragezeichens. Hiermit können Sie ein optionales Zeichen festlegen. Das folgende Suchmuster /<\/?body.*>/iU findet sowohl öffnende aus auch schliessende Body-Tags in einem HTML-Quelltext. Das optionale Zeichen \/? kann vorkommen, muss es aber nicht. Achten Sie darauf, dass das Zeichen / escaped werden muss.


<?php
// Zeichen
$htmltext "<body>Hello Welt</body>";
$reg_muster "/<\/?body.*>/iU";
// Ausgabe (1)
echo preg_match($reg_muster,$htmltext);
?>




Teilmuster

Innerhalb des Suchmusters können Teilmuster gebildet werden. Diese werden durch runde Klammern ( ) angegeben. Folgendes wird damit erreicht:
. Ein Satz Alternativen wird zusammengefasst.
. Teilmuster werden als einzelne Referenzen zurückgegeben. Ausschlaggebend für die Referenznummer ist die öffnende Klammer, die von links beginnend gezählt wird. Dies ist bei tieferen Verschachtelungen wichtig. PCRE_EXEC berücksichtigt dies ebenfalls.


Teil Ausdruck Bedeutung
Auto(bahn|mobil) Dieses Muster findet die Worte Autobahn und Automobil.
Auto(bahn|mobil|) Dieses Muster enspricht dem vorhergehenden und findet zusätzlich eine leere Zeichenkette.
der((goldene|silberne)(kelch|bogen)) Dieses Muster ergibt drei Teilmuster, wenn die Zeichenkette der silberne kelch geprüft wird:
silberne kelch, silberne und kelch. Diese Teilmuster haben die Referenzen 1,2 und 3.


Die Tatsache, dass runde Klammern mehrere Aufgaben übernehmen, führt beim Lesen regulärer Ausdrücke zu grossen Problemen. Zudem sind oft mehrere Lösungen möglich. Sie können die Referenzierung mit der Angabe ?: unterdrücken, um die Stellen zu dokumentieren, die nicht gezählt werden müssen. Ausserdem lassen sich so Teilmuster gezielt aus der Referenzierung ausblenden.

Teil Ausdruck Bedeutung
der((?:goldene|silberne)(kelch|bogen)) Dieses Muster ergibt lediglich zwei Teilmuster, wenn die Zeichenkette der goldene kelch geprüft wird: goldene kelch und kelch. Diese Teilmuster haben die Referenz 1 und 2. Das Teilmuster goldene wird unterdrückt.


Die maximale Anzahl von referenzierten Teilmustern beträgt 99. Die maximale Anzahl von Teilmuster an sich dagegen beträgt 200. In die Angabe der Unterdrückung der Referenz kann auch die Optionswahl eingebunden werden. Die folgenden beiden Suchmuster sind identisch.

Teil Ausdruck Bedeutung
(?i:auto|pkw) Findet auto und Auto.
(?:(?i)auto|pkw) Findet ebenfalls auto und Auto.


Beachten Sie auch hier, das eine Option in einem Zwei oder Teilmuster auf die anderen Teile Auswirkungen hat, da die Option zuerst ausgewertet werden und danach erst die Abarbeitung der Muster von links nach rechts erfolgt.


Greedy und Nongreedy

Einige Suchmuster haben die Eigenart, so viele Übereinstimmungen wie möglich zurückzugeben. Dieses Verhalten wird als greedy (gierig) bezeichnet.


Beispiel



<pre>
<?php
// Zeichen
$htmltext "<u>Ich</u> bin <u>hier</u>";
$reg_muster "/<u>.*<\/u>/i";
echo 
preg_match($reg_muster,$htmltext,$reg);
print_r($reg);
?>
</pre>




Ausgabe



1
Array
(
    [0] => Ich bin hier
)




Ausgabe - als Quelltext



1
Array
(
    [0] => <u>Ich</u> bin <u>hier</u>
)



Der Rückgabewert des Ausdrucks sollte der unterstrichene Text einschliesslich der HTML-Zeichen sein. Erwartet wird Ich und hier. Tatsächlich wird der gesamte Text zurückgegeben. Der Grund hierfür liegt in der Tatsache, dass sich der Ausdruck gierig verhält und das Teilmuster .* alles bin einschliesslich der letzten Fundstelle zurückgibt. Sie können einen solchen Ausdruck zwingen, genügsamer (nongreedy) zu sein, indem Sie nach dem Quantifizierer ein Fragezeichen setzen bzw. die Musteroption U (PRCE_UNGREEDY) verwenden. Die Musteroption U ermöglicht es Ihnen, auf das Fragezeichen zur Einschränkung des Quantifizierers zu verzichten.


$reg_muster = "/<u>.*?<\/u>/i";
$reg_muster = "/<u>.*<\/u>/iU";




Ausgabe



Array
(
    [0] => Ich
)



Der Nachteil ist, wie Sie anhand der Ausgabe sehen könne, dass Sie tatsächlich nur die erste Fundstelle zurück erhalten. Durch Klammerung können Sie erreichen, dass sämtliche Fundstellen zurückgegeben werden.


$reg_muster = "/(<u>.*?<\/u>)*/i";
$reg_muster = "/((?U)<u>.*<\/u>)*/i";




Ausgabe



Array
(
    [0] => Ich
    [1] => Ich
)




 


Funktionen für reguläre Ausdrücke
 




 sponsored by

Host Europe


HighText iBusiness


Host Europe




© 2001-2006 E-Mail SELFPHP - Damir Enseleit, info@selfphp.deImpressumKontakt
© 2005-2006 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de