Reguläre Ausdrücke mit PHP
Reguläre Ausdrücke sind nicht nur bei PHP ein effektives und anerkanntes Hilfsmittel, um eigentlich komplizierte Code-Bereiche erheblich zu vereinfachen. Mit nur einer Skriptzeile können Sachverhalte abgearbeitet werden, für die sonst zig if-Abfragen o. ä. notwendig wären.Wenn man sich "ohne Vorwarnung" einen komplexen regulären Ausdruck ansieht, wird man von den vielen Zeichen erschlagen. Insofern ist es wichtig, solche Ausdrücke, die auch kurz als "Regexp" (= Regular Expression) bezeichnet werden, richtig und vor allem Stück für Stück zu interpretieren.
Was genau sind reguläre Ausdrücke?
Anhand von bestimmten Regeln kann mit einem Regex der Inhalt eines Strings überprüft werden. Diese Überprüfung kann zum einen bedeuten, dass der Text bestimmte Regeln erfüllen muss oder man kann den Nutzer indirekt auch dazu zwingen, dass er nur bestimmte Zeichen oder Ziffern eingeben darf. Weiterhin gibt es die Möglichkeit, auch bestimmte Regeln auszuschließen.Der Programmierer entscheidet selbst, welche Variante in der jeweiligen Situation am sinnvollsten ist.
Die Regexp-Regeln werden in der Angabe des regulären Ausdrucks festgelegt und im Normalfall mittels einer if-Abfrage im Skript verwendet und weiter verarbeitet.
Vorteile und Nachteile von regulären Ausdrücken
- Wenn der Programmierer weiß, wie ein String aussehen soll, kann er mit einer Skriptzeile überprüfen, ob die Regeln erfüllt sind. Eine Liste von unzähligen if-Abfragen ist nicht notwendig.
- Wenn in einem Eingabefeld eine bestimmte Anzahl von Strings eingegeben werden soll, ist ein switch-case-Konstrukt normal. Falls sich die Alternativen der Eingaben allgmein erfassen lassen, kann man sich das switch-case-Konstrukt sparen und das gleiche mit einem regulären Ausdruck abhandeln.
- Mit regulären Ausdrücken kann einfach überprüft werden, dass der Inhalt eines Eingabefeldes entweder nur Buchstaben oder nur Zahlen enthalten darf.
- Komplexe reguläre Ausdrücke sind schwer interpretierbar.
Regexp-Theorie bei PHP
PHP unterstützt zwei Varianten von regulären Ausdrücken. Zum einen gibt es eine POSIX-Variante mit den dazugehörigen Funktionen und ein "Funktionspaket", die eine Schreibweise benötigt, die an die an die Sprache PERL angelehnt ist.Der Unterschied zwischen den Paketen ist, dass die PERL-Variante mehr Funktionen wie zum Beispiel non-greedy Matching, Assertions oder bedingte Subpatterns unterstützt, die das POSIX-Paket nicht kennt.
Die Extensions für beide Alternativen sind standardmäßig in einer PHP-Umgebung enthalten und auch aktiviert. Insofern ist kein Eingriff in die php.ini oder ein zusätzlicher Download notwendig, um die regulären Ausdrücke nutzen zu können.
Sonderzeichen zur Definition von regulären Ausdrücken
Es gibt eine Vielzahl von Sonderzeichen und Ausdrücken, die den Programmierer bei der Festlegung der Regeln für den Regexp unterstützen sollen.Die folgende Tabelle zeigt eine Übersicht aller gültigen Sonderzeichen. Alle aufgelisteten Zeichen können beliebig miteinander kombiniert werden. Weiterhin gelten sie sowohl für die POSIX- als auch für die "PERL-orientierte" Variante.
Sonderzeichen | Bedeutung |
---|---|
^ | Stringanfang wird geprüft |
$ | Stringende wird überprüft |
. | Beliebiges Zeichen |
x? | Zeichen x kann vorkommen |
x* | Zeichen x kommt öfters oder gar nicht vor |
x+ | Zeichen x kommt einmal oder öfters vor |
x{3} | Zeichen x kommt 3 mal vor |
x{3,} | Zeichen x kommt 3 mal oder öfters vor |
x{3,5} | Zeichen x kommt min. 3x und max. 5x vor |
[1-10] | Eine Zahl zwischen 1 und 10 |
(x|y) | Zeichen x oder Zeichen y kommen vor |
[a-f] | Ein Kleinbuchstabe zwischen a und f |
[A-F] | Ein Großbuchstabe zwischen a und f |
[^a-f] | Kein Kleinbuchstabe zwischen a und f |
[_A-Za-z] | Komplettes Alphabets sowie ein Unterstrich |
[:space:] | Leerzeichen |
() | Klammern für Ausdrücke aus mehreren Zeichen |
Maskierung von Sonderzeichen wie ? oder - (*) |
Weiterhin bietet PHP die Möglichkeit - unabhängig von POSIX oder PERL-orientiert - bestimmte Klassen von Sonderzeichen zu definieren. Die Klassen ersetzen zum Teil die Zeichen aus der obigen Tabelle bzw. fasst sie weiter zusammen.
Die folgende Liste zeigt die zur Verfügung stehenden Klassen:
Klasse | Bedeutung |
---|---|
alpha | Alle Groß- und Kleinbuchstaben |
Jedes druckbare Zeichen inkl. Leerzeichen | |
cntrl | Steuerzeichen |
upper | Nur Großbuchstaben |
lower | Nur Kleinbuchstaben |
graph | Jedes druckbare Zeichen außer Leerzeichen |
xdigit | Prüfung auf hexadezimale Werte |
Reguläre Ausdrücke nach der POSIX-Variante
Die POSIX-Variante bietet folgende Funktionen an:Funktion ereg_replace
Damit wird ein String mit Hilfe eines Regexp durchsucht und die betreffenden Stellen mit einem angegebenen Ersatz ersetzt.Parameter:
Regexp-Suchmuster, Ersatz, ursprünglicher Textausdruck
Hinweis: Wenn Ziffern als Ersatz verwendet werden, müssen diese in Anführungszeichen angegeben werden.
Beispiel:
<?
$string = "Ein Mensch hat zwei Beine";
$replace = "3";
$string_new = ereg_replace("zwei", $replace, $string);
echo $string_new;
?>
Funktion ereg
Mit dieser Funktion wird standardmäßig ein String mit Hilfe der Definitionen eines regulären Ausdrucks durchsucht.Parameter:
Regexp-Suchmuster, ursprünglicher Textausdruck, Array für Teilausdrücke (optional)
Hinweis: Wenn im Regexp Ausdrücke definiert sind, die mit einer geschweiften Klammer angegeben werden, ist mit Hilfe des optionalen Parameters der Zugriff auf diese Ausdrücke möglich. Der optionale Parameter wird automatisch als Array betrachtet.
Das erste Element im Array entspricht dabei dem ursprünglichen Ausdruck.
Beispiel:
<?
$date = "2007-09-12";
if( ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs) )
{
echo "$regs[3].$regs[2].$regs[1]<br>$regs[0]";
}
else
{
echo "Ungültiges Datumsformat: $date";
}
?>
Funktion eregi
Diese Funktion ist identisch zuereg
, nur dass hier auf Groß- und Kleinschreibung keine Rücksicht genommen wird.
Funktion eregi_replace
Diese Funktion macht genau das gleiche wieereg_replace
, nur das hier auf die Unterscheidung von Groß- und Kleinschreibung verzichtet wird.
Funktion split
Diese Funktion im bezug auf reguläre Ausdrücke ein Sonderfall. Damit wird zwar auch ein bestimmter String mit Hilfe eines regulären Ausdrucks durchsucht. Gleichzeitig wird der String aber - falls das Zeichen im regulären Ausdruck gefunden wurde, aufgeteilt und die einzelnen Elemente in ein Array geschrieben.Parameter:
Regulärer Ausdruck, String, Einschränkung
Hinweis: Die Einschränkung wird als Integer-Zahl angegeben und bewirkt, dass nur die betreffende Anzahl von Array-Elementen angelegt wird. Das letzte Array-Element enthält dann den Rest des eigentlichen Strings. Die Angabe einer Beschränkung ist optional.
Beispiel:
<?
$datum = "2007-09-12";
$date_segment = split("-",$datum);
?>
Funktion spliti
Diese Funktion macht genau das gleiche wiesplit
, nur das hier auf die Unterscheidung von Groß- und Kleinschreibung verzichtet wird.
Funktion sql_regcase
Diese Funktion wandelt einen normalen String in eine Schreibweise, die zur Regexp-Definition verwendet werden kann, um.Parameter:
String, der umgewandelt werden soll.
Beispiel:
<?
echo sql_regcase("Testausdruck");
?>
Reguläre Ausdrücke mit PERL-ähnlicher Schreibweise
Die Funktionen, die in dieser Alternative zur Verfügung stehen, sind im Normalfall schneller als die POSIX-Gegenstücke. Deshalb wird auch empfohlen, auf die "PERL-Funktionen" zurückzugreifen.Funktion preg_match
Diese Funktion stellt eine "normale" Suche mit Hilfe eines regulären Ausdrucks zur Verfügung.Parameter:
Suchmuster, String, Array zum Zugriff auf die Treffer (optional)
Beispiel:
<?
$string = "Dies ist ein Testausdruck";
if( preg_match("/^Dies/", $string, $result) )
{
print_r($result);
}
?>
Funktion preg_match_all
Diese Funktion bewirkt genau das gleiche wiepreg_match
. Der Unterschied ist, dass hier der komplette String durchsucht und nicht - wie bei preg_match
- nach dem ersten erfolgreichen Suchvorgang abgebrochen wird.
Funktion preg_grep
Mit dieser Funktion kann ein Array nach einem bestimmten Suchmuster durchsucht werden. Die Elemente, die das Suchkriterium erfüllen, werden in ein neues Array geschrieben.Parameter:
Suchmuster, Array zum Durchsuchen
Beispiel:
<?
$original = array("1","A","2","B","3");
$new = preg_grep("/(d)/",$original);
print_r($new);
?>
Funktion preg_replace
Damit wird ein Textausdruck nach einem Suchmuster durchsucht und die betreffenden Stellen durch einen anderen Ausdruck ersetzt.Parameter:
Suchmuster, Ersatzausdruck, ursprünglicher Ausdruck, Limit für Ersetzungen, Anzahl der Ersetzungen
Allgemeines Schema:
preg_replace(/Suchmuster/Ersatz/, Textausdruck);
Hinweis: Die Angabe eines Limits für Ersetzungen und einer Variablen für die Anzahl der Ersetzungen ist optional. Wenn man beide Parameter mit angibt, legt man zum einen fest, wie oft die Ersetzungen maximal durchgeführt werden sollen und wie viele Ersetzungen tatsächlich stattgefunden haben.
Funktion preg_split
Mit dieser Funktion wird ein String anhand eines Trennungszeichens aufgeteilt. Die einzelnen Elemente werden in ein Array geschrieben.Parameter:
Suchmuster, String, maximale Anzahl der Elemente (optional)
Hinweis: Falls eine maximale Anzahl der Array-Elemente angegeben wird, werden auch nur entsprechend viele Elemente des Strings in das Array geschrieben.
Besonderheiten bei der PERL-orientierten Schreibweise
Suchmuster
Das Suchmuster muss zwingend zwischen zwei Schrägstrichen angegeben werden.Beispiel:
/ Suchmuster /
Flags nach dem Suchmuster
Nach dem Suchmuster können bei Bedarf noch sog. Flags angegeben werden. Diese durch Kleinbuchstaben dargestellten Informationen präzisieren das Suchergebnis bzw. schränken es weiter ein.Dabei können auch mehrere Suchmuster angegeben werden. Wenn dies benötigt wird, müssen die Buchstaben direkt hintereinander angegeben werden.
Die folgende Tabelle zeigt eine Liste der Flags:
Flag | Bedeutung |
---|---|
c | Keine Rücksetzung der Suchposition bei Fehler |
e | Bei Ersetzungen wird Ersatzzeichenkette als Perl-Code ausgeführt |
g | Alle Vorkommen des Suchmusters finden |
i | Groß- und Kleinschreibung ignorieren |
m | Zeichenketten können aus mehreren Zeichen bestehen |
o | Suchmuster nur einmal anwenden |
s | Zeichenketten als eine einzige Zeile betrachten |
x | Erweiterte Schreibweise verwenden |
Zugriff auf Teilausdrücke im Suchmuster
In der POSIX-Methode musste man ein weiteres Array als Parameter mit angeben, wenn man auf Teilausdrücke im Suchmuster zugreifen will (Beispiel: Funktionereg
).In der PER-Variante ist dies nicht notwendig. Hier stehen die Systemvariablen $1 ... $x automatisch zur Verfügung. Dabei realisiert $1 den Zugriff auf den ersten Teilausdruck und $x den Zugriff auf den x-ten Teilausdruck.
Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.
Weiterlesen: ⯈ PHP und XML
Über uns

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project