Kontakt aufnehmen

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 - (*)
(*) Mit dem Backslash müssen Sonderzeichen wie ein Bindestrich, Anführungs- oder Fragezeichen maskiert werden, damit sie vom PHP-Interpreter nicht innerhalb des Quellcodes sondern als einfacher Text interpretiert werden.

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
print 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";
}
?>

Anmerkung: Der Inhalt von $regs[0] ist gleich dem Inhalt von $date.

Funktion eregi

Diese Funktion ist identisch zu ereg, nur dass hier auf Groß- und Kleinschreibung keine Rücksicht genommen wird.

Funktion eregi_replace

Diese Funktion macht genau das gleiche wie ereg_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 wie split, 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");
?>

... ergibt in der Ausgabe [Tt][Ee][Ss][Tt][Aa][Uu][Ss][Dd][Rr][Uu][Cc][Kk].

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);
}
?>

... ergibt Array ( [0] => Dies ) in der Ausgabe.

Funktion preg_match_all

Diese Funktion bewirkt genau das gleiche wie preg_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);
?>

... ergibt in der Ausgabe Array ( [0] => 1 [2] => 2 [4] => 3 ).

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: Funktion ereg).
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

Stefan Wienströer

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

Cookie-Einstellungen

Helfen Sie dabei, uns noch besser zu machen. Wir nutzen Cookies und ähnliche Technologien, um die Website auf Ihre Bedürfnisse anzupassen. Zur Datenschutzerklärung

Auswahl speichern