. .

PHP • Regular Expressions / RegExp

PHP - Reguläre Ausdrücke

Reguläre Ausdrücke, auch Regex oder RegExp genannt, sind Zeichenketten, die die Mengen bzw. Teilmengen von Zeichenketten mit Hilfe von syntaktischen Regeln beschreiben.


Einfacher kann man Reguläre Ausdrücke als eine Art Filterregel oder Schablone beschreiben, die beispielsweise in einem Text nach dem jeweiligen regulären Ausdruck in Form eines Musters (engl. Pattern) Übereinstimmungen filtert. So lassen sich Zeichenketten an Hand dieser Muster überprüfen, ob der Inhalt der Zeichenkette den im Muster festgelegten Vorgaben entspricht. Diese Regulären Ausdrücke finden in PHP, unter Verwendung der PCRE Funktionen, vor allem beim validieren von Formulardaten Anwendung. » Erklärung zu PCRE FunktionenErklärung zu PHP PCRE-Funktionen und » Beispiele zur Anwendung von Regulären Ausdrücken in PHPBeispiele von Regulären Ausdrücken in PHP.
Spickzettel / Cheat Sheets


Aufbau der Regulären Ausdrücke


Reguläre Ausdrücke (in PHP) bestehen aus drei Teilen:

Delimiter Suchmuster Delimiter Modifier

Delimiter

Die Delimiter begrenzen das Suchmuster am Anfang und Ende, damit für den PHP-Interpreter ersichtlich ist, wo das eigentliche Suchmusters beginnt und endet. Als Delimiter kann jedes nicht-alphanumerische Zeichen ausser dem \ (Backslah) verwandt werden. Häufig werden neben dem / (Slash) auch # (Raute) oder das ! (Ausrufezeichen) genutzt.

Delimiter
Zeichen Bezeichung Beispiel
/ Slash /[A-Z]/
# Raute #[A-Z]#
! Ausrufezeichen ![A-Z]!
~ Tilde ~[A-Z]~
% Prozent-Zeichen (vom Hundert) %[A-Z]%
= Gleichheitszeichen =[A-Z]=
& Kaufmännisches Und (Ampersand) &[A-Z]&

Suchmuster

Das Suchmuster ist der eigentliche Reguläre Ausdruck, die einfachsten Suchmuster bestehen genau aus den Zeichen oder Ziffern die gesucht werden, sucht man beispielsweise die Ziffer 1 verwendet man das Suchmuster /1/. Neben diesen einfachen Suchmustern können auch statische Texte, MetazeichenMetazeichen oder, um bestimmte Gruppen von Zeichen zu definieren (z.B. die Buchstaben von A bis C), ZeichenklassenZeichenklassen bzw. POSIX-ZeichenklassenPOSIX-Zeichenklassen verwendet werden.


Modifier

Der so genannte Modifier beeinflust das eigentliche Suchmuster, so lässt sich beispielsweise festlegen ob Leerzeichen innerhalb des Suchmusters ignoriert werden oder zwischen Groß- und Kleinschreibung von Zeichen innerhalb des Suchmusters unterschieden werden soll.

Modifier
ZeichenBedeutungBeispiel
ideaktiviert die Unterscheidung zwischen Groß- und Kleinschreibung./[A-Z]/i
mDer übergebene Text wird als mehrzeilig interpretiert Metacharakter ^ und $ gelten für jede einzelne Zeile./[A-Z]/m
sDer gesamte übergebene Text wird als eine Zeile interpretiert, der . (Punkt - beliebiges Zeichen) trifft somit auch auf Zeilenumbrüche zu./[A-Z]/s
xalle Leerzeichen, die nicht maskiert sind oder sich innerhalb von Zeichenklassen befinden, werden ignoriert./[A-Z]/x
egilt nur bei der Verwendung von preg_replace, bei der man dadurch auf Unterausdrücke definierte Teile des Suchmusters zugreifen kann, um sie als Ersatz weiter zu verwenden./[A-Z]/E
Ader Anfang des Suchmusters muss mit dem Anfang der übergebenen Zeichenkette übereinstimmen./[A-Z]/A
Dwird der Modifier m verwandt, so wird dieser durch den Modifier d deaktiviert./[A-Z]/d
Uhiermit lässt sich die Gier der Quantifier unterdrücken der Parser versucht mehr Zeichen der Zeichenkette zu betrachten als notwendig/[A-Z]/U


Zeichenklassen   [   ]

Mit so genannten Zeichenklassen können Gruppen von Zeichen definiert werden, die erlaubt oder verboten werden sollen. Zeichenklassen werden innerhalb von eckigen Klammern [   ] notiert. Der Bindestrich erlaubt es Zeichenbereiche innerhalb einer Zeichenklasse zu definieren.

Das bereits mehrfach verwandte Beispiel [A-Z] ist also eine Zeichenklasse [   ] in der ein Zeichenbereich A-Z definiert ist, und somit alle Zeichen von A bis Z in Großschreibung erlaubt sind. Sollen alle Klein- und Großbuchstaben von A-Z erlaubt werden, wird in der Zeichenklasse [   ] der Zeichenbereich A-Za-z notiert. Sollen hingegen alle Ziffern erlaubt werden, wird der Zeichenbereich 0-9 notiert.

Sollen bestimmte Zeichenbereiche nicht vorkommen, kann man mit dem ^ Accent Zirkumflex die Zeichenklasse negieren. Die Zeichenklasse [^A-Z] schließt somit alle großgeschriebenen Zeichen aus. Wichtig, soll ein Zeichenbereich negiert werden, so muss das ^ Accent Zirkumflex am Anfang des Zeichenbereichs innerhalb der Zeichenklasse notiert werden.

Zeichenklassen
ZeichenAlternativ Bedeutung
[A-Z]  erlaubt alle Zeichen von A bis Z in Großschreibung
[a-z]  erlaubt alle Zeichen von a bis z in Kleinschreibung
[A-Za-z]  erlaubt alle Zeichen von A bis Z & a bis z in Klein- & Großschreibung
[0-9] \derlaubt alle Ziffern
[^A-Z]  verbietet alle Zeichen von A bis Z in Großschreibung
[^0-9] \Dverbietet alle Ziffern
[A-Za-z0-9_] \werlaubt alle Ziffern & Zeichen von A bis Z & a bis z in Klein- & Großschreibung
[^A-Za-z0-9_] \Wverbietet alle Ziffern & Zeichen von A bis Z & a bis z in Klein- & Großschreibung
[\t\n\f\r] \serlaubt die Auszeichnung von Leerraumzeichen (Abkürzung für [\f\n\r\t\v]
[^\t\n\f\r] \Skeine Auszeichnung von Leerraumzeichen [\f\n\r\t\v]
[\A] \bentspricht einer Wortgrenze (Position vor dem \b entspricht \w gefolgt von \W)
[^\A] \Bentspricht einer NICHT-Wortgrenze (Position vor dem \b entspricht \w gefolgt von \W)

Die Alternativ-Auszeichnung entspricht jeweils einem Zeichen, wenn mehrere gesucht werden sollen muss die Auszeichnung für jedes einzelne Zeichen erfolgen, bsw. /\d\d\d/ für eine dreistellige Zahl.

preg_replace('/[3-4]/' , 'A' , $subject) 


<?php
$pattern	= '/[3-4]/';
$replacement	= 'A';
$subject	= '123456';
echo preg_replace('/[3-4]/' , 'A' , $subject);
?>
Das Beispiel erzeugt folgende Ausgabe:
12AA56

POSIX-Zeichenklassen   [:alpha:]

In vielen neueren Implementationen können POSIX-klassen angegeben werden. Der POSIX-Standard vergibt für häufig gebrauchte Zeichenklassen symbolische Namen, die wie ein Zeichen in einer Klasse gebraucht werden können. POSIX-Zeichenklassen sind nur innerhalb von Zeichenklassen erlaubt und müssen zusätzlich geklammert werden.

POSIX-Zeichenklassen
ZeichenBedeutung
[:lower:]Kleinbuchstaben
[:upper:]Großbuchstaben
[:alpha:]Buchstaben, also [:lower:] und [:upper:]
[:digit:]Ziffern 0-9
[:xdigit:]Hexadezimale Ziffern, entspricht [0-9A-Fa-f]
[:alnum:]Alphanumerische Zeichen: [:alpha:] und [:digit:]
[:blank:]Leerzeichen und Tabulator
[:space:][:blank:] sowie vertikaler Tabulator, Zeilen- und Seitenvorschub, Wagenrücklauf.
[:punct:]Interpunktionszeichen wie: , ! " # $ % & ' { } ( ) [ ] ? * + / - . : ; < = > @ \ ^ _ ` | ~
[:cntrl:]Steuerzeichen (nicht darstellbaren Zeichen)
[:print:]Druckbare Zeichen, entspricht [:alnum:], [:punct:] und [:blank:]
[:graph:]Druckbare Zeichen ohne [:blank:]


Metazeichen

Um in Regulären Ausdrücken bestimmte Suchmuster darzustellen, werden weitere Zeichen benötigt die spezielle Funktion definieren und nicht zum gesuchten Text gehören. Diese Zeichen werden als Metazeichen bezeichnet.

^ der Accent Zirkumflex kennzeichnet den Anfang der Zeichenkette und wird dem Suchmuster vorangestellt.

^http:

trifft also auf den Text http://web.de zu, nicht jedoch href="http://web.de", da hier nicht wie im Suchmuster angegeben http:// am Anfang des Textes steht.

preg_replace('/^http:\/\//' , '' , $subject) 


<?php
$pattern	= '/^http:\/\//';
$replacement	= '';
$subject	= 'http://webdesign.tepelmann.com';
echo preg_replace('/^http:\/\//' , '' , $subject);
?>
Das Beispiel erzeugt folgende Ausgabe:
webdesign.tepelmann.com

der Punkt steht für jedes beliebige Zeichen, ausgenommen einen Zeilenumbruch. Es sei denn, es wird der Modifier m verwandt, dann würde der Punkt auch auf den Zeilenumbruch zutreffen.

Ka.

findet in einem Text sowohl den Namen Kai wie auch Kay. Da der Punkt für jedes beliebige Zeichen steht, werden auch Ausdrücke wie Kat und KaU gefunden.

$ das Dollarzeichen ist das Pedant zum Zirkumflex und kennzeichnet das Ende der Zeichenkette.

zeichen$

trifft also auf den Text Währungszeichen zu, nicht jedoch auf Zeichenkette, da hier nicht wie im Suchmuster angegeben zeichen am Ende des Textes steht.

| die Pipe definiert eine ODER Funktion, der Text muss also entweder das eine oder das andere enthalten.

zeichen(kette|klasse|bereich)

trifft also auf den Text zeichenkette genauso zu, wie auf zeichenklasse und zeichenbereich

preg_match_all('/zeichen(kette|klasse|bereich)/i' , $subject, $matches, PREG_SET_ORDER) 


<?php
$pattern	= '/zeichen(kette|klasse|bereich)/i';
$subject	= 'Zeichenklasse [A-Z] in der ein Zeichenbereich A-Z definiert ist';
preg_match_all('/zeichen(kette|klasse|bereich)/i' , $subject, $matches, PREG_SET_ORDER); print_r $matches;
?>
Das Beispiel erzeugt folgende Ausgabe:
Array
(
[0] => Array
(
[0] => Zeichenklasse
[1] => klasse
)
[1] => Array
(
[0] => Zeichenbereich
[1] => bereich
)
)

<?php
$pattern	= '/zeichen(kette|klasse|bereich)/i';
$subject	= 'Zeichenklasse [A-Z] in der ein Zeichenbereich A-Z definiert ist';
$erg_preg_match_all = preg_match_all('/zeichen(kette|klasse|bereich)/i' , $subject, $matches ); for($i=0; $i<$erg_preg_match_all; $i++)
{
print $matches[0][$i] .'<br />';
}
?>
Das Beispiel erzeugt folgende Ausgabe:
Zeichenklasse
Zeichenbereich

() die Runden Klammern definieren Zusammenfassungen zu Unterausdrücken innerhalb des Suchmusters.

(Ab|Bus|Bahn)fahrt

trifft also auf den Text Abfahrt genauso zu, wie auf Busfahrt und Bahnfahrt

\ der Backslash maskiert beispielsweise Metazeichen, wenn diese als normales Zeichen und nicht als Metazeichen behandelt werden sollen. Da der Backslash selbst ein Metazeichen ist, muss, wenn im Suchmuster ein Backslash als normales Zeichen verwandt werden soll, auch dieser durch einen Backslash maskiert werden.

100\$

trifft also auf den Text 100$ zu

- der Bindestrich gilt nur innerhalb von Zeichenklassen als Metazeichen und dient hier zur Angabe von Zeichenbereichen.

[X-Z]

trifft also auf die Zeichen x y z zu


Quantifier

Quantifier definieren die Anzahl eines Zeichens oder einer Zeichengruppe, und ermöglichen so die Angabe der minimalen, maximalen oder exakten Anzahl des Zeichens oder der Zeichengruppe. Der Quantifier bezieht sich jeweils auf den direkt davor stehenden Ausdruck.

* der Stern gibt an, dass ein Ausdruck keinmal bis beliebig oft vorkommen kann.

/.*/

trifft also auf jedes beliebige Zeichen oder Zeichenkette zu, die auch leer sein kann.

+ das Plus gibt an, dass ein Ausdruck mindestens einmal bis beliebig oft vorkommen kann.

/.+/

trifft also auf jede beliebige Zeichenkette zu, die mindestens einmal bis beliebig oft vorkommen kann.

? das Fragezeichen gibt an, dass ein Ausdruck vorkommen kann, aber nicht vorkommen muss.

https?:

Das Fragezeichen bezieht sich hier nur auf den Buchstaben s und drückt somit aus, dass dieser Buchstabe vorkommen darf, aber nicht vorkommen muss.

preg_replace('/^https?:\/\//' , '' , $subject) 


<?php
$pattern	= '/^https?:\/\//';
$replacement	= '';
$subject	= 'http://webdesign.tepelmann.com';
echo preg_replace('/^https?:\/\//' , '' , $subject);
?>
Das Beispiel erzeugt folgende Ausgabe:
webdesign.tepelmann.com

{ } die geschweiften Klammern ermöglichen so die Angabe der minimalen, maximalen oder exakten Anzahl an Zeichen oder Wiederholungen.

{5}

gesuchte Ausdruck muss also genau fünf mal vorkommen

{2, }

gesuchte Ausdruck muss mindestens zwei mal vorkommen

{2,5}

gesuchte Ausdruck muss mindestens zwei mal und maximal fünf mal vorkommen

{ ,5}

gesuchte Ausdruck darf maximal fünf mal vorkommen

Wichtig ist, dass die Angabe innerhalb der Klammern nicht größer als 65536 sein darf und der zweite Wert größer oder gleich dem ersten sein muss.


Backreferences

Mit Hilfe so genannter Backreferences kann man, auf innerhalb von Runden Klammern definieren Zusammenfassungen zu Unterausdrücken innerhalb des Suchmusters, zurückgreifen.

(a-c)-(d-f)-(g-i)

Diese Unterausdrücke lassen sich per $1, $2 und $3 ansprechen, anstatt des Dollarzeichen $ kann der jeweiligen Nummer auch ein Backslash \ vorangestellt werden. Sinnvoll werden solche Backreferences bei Verwendung von

(<strong>|<b>)(.*?)(</$1>)
preg_replace('/<b>(.*?)<\/b>/' , '<strong>$1</strong>' , $subject) 


<?php
$pattern	= '/<b>(.*?)<\/b>/';
$replacement	= '<strong>$1</strong>';
$subject	= '<b>fett geschriebener Text</b>';
echo preg_replace('/<b>(.*?)<\/b>/' , '<strong>$1</strong>' , $subject);
?>
Das Beispiel erzeugt folgende Ausgabe:
<strong>fett geschriebener Text</strong>

Linkempfehlungen

Verweise & Links

Reguläre Ausdrücke


» zum Seitenanfang

Tipps & Tricks

mehr zum Thema: nächster und vorheriger EintragMySQL nächsten und vorherigen Datensatz

Den alphabetisch nächsten und vorherigen Datensatzes aus einer Datenbank ermitteln und in alphatischer Reihenfolge den nächsten und vorherigen Datensatz ausgeben.

» mehr zum Thema: nächster und vorheriger Eintragmehr lesen

mehr zum Thema: Teil eines Datensatzes suchen und ersetzenMySQL Teilstring suchen und ersetzen

In einer Datenbanktabelle einen bestimmten Teil eines Strings suchen und diesen dann auszutauschen.

» mehr zum Thema: Teil eines Datensatzes suchen und ersetzenmehr lesen

mehr zum Thema: Browser & IP-Adresse indentifizierenPHP Browser identifizieren

Beim Aufruf einer Website sendet jeder Browser eine Kennung, die dem Server angibt, um welchen "User-Agent" es sich handelt.

» mehr zum Thema: Browser & IP-Adresse indentifizierenmehr lesen

mehr zum Thema: Datum und UhrzeitfunktionPHP Datum und Zeit

Für zeitgesteuerte Inhalte sind Datum- und Uhrzeitfunktionen unerlässlich. Grundlage bildet der von Unix-Systemen verwendete Timestamp.

» mehr zum Thema: Datum und Uhrzeitfunktionmehr lesen

mehr zum Thema: Anzahl Zeichen im String ermittelnPHP Zeichen & Wörter zählen

Häufig genügt es zu wissen, wie viele Zeichen der Text beinhaltet, php kann jedoch weitaus mehr.

» mehr zum Thema: Anzahl Zeichen im String ermittelnmehr lesen

mehr zum Thema: Zeichen & Zeichenfolgen ersetzenPHP Zeichen ersetzen

Häufig ist es notwendig mehrere Zeichen oder Zeichenfolgen innerhalb eines Strings zu ersetzen.

» mehr zum Thema: Zeichen & Zeichenfolgen ersetzenmehr lesen

mehr zum Thema: HTML-Entity - Maskierungen für SonderzeichenPHP HTML-Entities

Standardkonformer HTML-Code erfordert eine korrekte Ausgabe sämtlicher Literalen, dazu gehören auch und vor allem soggenannte HTML-Entity.

» mehr zum Thema: HTML-Entity - Maskierungen für Sonderzeichenmehr lesen

mehr zum Thema: Farbwerte von RGB nach HEX bzw. HEX nach RGBPHP RGB/HEX-Umrechner

Um die Farben einzelner Elemente auf Webseiten festzulegen, gibt es zwei Möglichkeiten. Die Farben können als RGB-Werte im Hexadezimalformat oder ...

» mehr zum Thema: Farbwerte von RGB nach HEX bzw. HEX nach RGBmehr lesen

mehr zum Thema: Perl Compatible Regular ExpressionsPHP PCRE-Funktionen

Die PHP PCREInformationBedeutung: PCREPerl Compatible Regular Expressions Funktionen sind eine Programmbibliothek zur Auswertung von Regulären Ausdrücken ...

» mehr zum Thema: Perl Compatible Regular Expressionsmehr lesen

mehr zum Thema: Regular Expressions / RegExpPHP Reguläre Ausdrücke

Reguläre Ausdrücke, auch Regex oder RegExp genannt, sind Zeichen- ketten, die ...

» mehr zum Thema: Regular Expressions / RegExpmehr lesen

mehr zum Thema: Regular Expressions / RegExpRegEx Beispiele

Praxisbzogene Regular Expression Beispiele für die Anwendung in PHP.

» mehr zum Thema: Regular Expressions / RegExpmehr lesen


Tastaturkürzel