Anzeige
Tutorialbeschreibung

PHP - Teil 15 - Reguläre Ausdrücke

PHP - Teil 15 - Reguläre Ausdrücke

Bei diesen regulären Ausdrücken handelt es sich um eine bestimmte Form von Suchmustern. Interessant ist das zum Beispiel, wenn Eingaben von Benutzern in Formularen auf ihre Richtigkeit hin überprüft werden sollen. Denkt beispielsweise an die Überprüfung von E-Mail-Adressen oder Telefonnummern. In diesem Video erfahrt ihr, wie ihr mit diesen regulären Ausdrücken arbeiten könnt.

... übrigens findest du die komplette Serie hier: PHP-Workshop-DVD - Basics & Tricks - Schnapp sie dir in unserem Shop oder in der Kreativ-Flatrate!


Reguläre Ausdrücke können die Programmierung erheblich vereinfachen. Allerdings fällt der Einstieg in diese Thematik nicht eben leicht.

Bevor in das eigentliche Thema eingestiegen wird, ein allgemeiner Hinweis: Zum Testen regulärer Ausdrücke bietet sich unter Linux das Tool pcretest an. Wer unter Windows arbeitet bzw. ein Online-Tool verwenden will, wird beispielsweise auf der Seite http://regexp-evaluator.de/evaluator/ fündig.

Bilder



 
Und noch ein Hinweis vorweg: Mit regulären Ausdrücken lassen sich ganze Bücher füllen. (Die es übrigens tatsächlich zuhauf gibt). Daher kann an dieser Stelle nur ein grundlegender Einstieg geliefert werden.

Hinter dem Begriff "reguläre Ausdrücke" (manchmal auch "Regex" vom Englischen "regular expressions") verbirgt sich die komplexe Welt der Vergleiche mit Textmustern. Ein erstes Beispiel soll zeigen, was es mit den regulären Ausdrücken eigentlich auf sich hat.

Die folgende Syntax überprüft die per POST-Methode übergebene Zeichenkette dahingehend, ob es sich um eine gültige E-Mail-Adresse handelt. Ist das nicht der Fall, wird eine Fehlermeldung ausgegeben.

if (!preg_match('/^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+.)+([a-zA-Z]{2,4})$/', $_POST["email"])){
            $error = "Bitte geben Sie eine gültige E-Mail-Adresse an";
}

Dieses Beispiel vermittelt einen ersten Eindruck von der möglichen Komplexität dieser Suchmuster.

PHP unterstützt zwei Arten von regulären Ausdrücken:
  • POSIX – Das ist ein stark vereinfachtes Verfahren, um Suchmuster anzulegen. Auch wenn es nicht so komplex wie PCRE ist, so reicht es doch meistens aus. Am häufigsten werden zum Arbeiten mit POSIX-Ausdrücken die in PHP zur Verfügung stehenden ereg_*-Funktionen verwendet.
  • PCRE – Das sind die PERL-kompatiblen Ausdrücke. Diese sind sehr leistungsfähig, dafür aber auch äußerst komplex. Für die Arbeit mit diesen Ausdrücken gibt es in PHP die verschiedenen preg_*-Funktionen.

 
Im einfachsten Fall erzeugt man in PHP einen regulären Ausdruck über Zeichenklassen. Dabei handelt es sich um in eckige Klammern gesetzte Zeichen. Ein Beispiel:

<?php
  $datum = '01-05-2011';
  if (preg_match('/^(d{2})-(d{2})-(d{4})$/', $datum, $wert)){
      echo $wert[0];
  } else {
      echo 'Ungültiges Datumsformat: '.$datum;
  }
  ?>

Hier wird überprüft, ob in der Zeichenkette $datum ein Datumsformat enthalten ist. Dabei wird zunächst das gültige Datumsformat angegeben.

Bilder



 
Entscheidend sind dabei die Angaben innerhalb der geschweiften Klammern. So wird durch die folgende Anweisung festgelegt, dass zwei Zeichen enthalten sein müssen.

{2}

Nur, wenn die Zeichenkette dem angegebenen Muster entspricht, wird das Datum tatsächlich ausgegeben. Anderenfalls gibt es eine Fehlermeldung.

Bilder



 

Allgemeiner Aufbau

Reguläre PCRE-Ausdrücke haben immer denselben Aufbau.
  • Delimiter – Das ist das erste Zeichen eines Strings. Es dient dazu, den eigentlichen regulären Ausdruck von einer Liste globaler Modifikatoren (siehe unten) zu trennen. Normalerweise gibt man als Delimiter eines der beiden Zeichen ~ oder / an.
  • Regex – Das ist der eigentliche reguläre Ausdruck. Hierüber gibt man also an, wie die zu suchende Zeichenkette aussehen soll.
  • Delimiter – Jetzt wird der zuvor definierte Delimiter eingesetzt, um die nachfolgende Anweisung vom regulären Ausdruck zu trennen.
  • Modifier – Hier gibt man Modifikatoren für den gesamten regulären Ausdruck an.

Eine vollständige Übersicht aller verfügbaren regulären Ausdrücke kann an dieser Stelle nicht gegeben werden. Dafür ist deren Anzahl schlichtweg zu groß. Nachfolgend findet ihr aber einige regulären Ausdrücke, die erfahrungsgemäß immer wieder benötigt werden.

Angenommen, ihr wollt überprüfen, ob eine Eingabe Ziffern zwischen 1 und 6 enthält.

[123456]

Dazu gibt man innerhalb der eckigen Klammern die erlaubten Zeichen an. Da die Ziffern im aktuellen Beispiel fortlaufend sind, könnte man auch Folgendes schreiben:

[1-6]

Angenommen, ihr möchtet untersuchen, ob jeweils eine Kombination aus einer Ziffer und einem bestimmten Buchstaben vorhanden ist.

[1-9][ab]

Hierdurch würde z. B. 1a, 1b, 8a und 9b gefunden werden. Das ließe sich auch noch ausbauen.

[1-9][a-d]

Hier würden neben den Ziffern 1 bis 9 auch die Buchstaben a, b, c und d gefunden werden.

 
Nun kann es natürlich passieren, dass ein bestimmtes Element vorkommen kann, aber eben nicht vorkommen muss. Hier kommt das Fragezeichen ins Spiel. Dieses Fragezeichen wird hinter das betreffende Element gesetzt.

 [0-9]?[0-9]?[a-z]?

In diesem Beispiel kann die Zeichenkette aus bis zu 2 Ziffern und einem Buchstaben am Ende bestehen. Gefunden würde also beispielsweise 14a und 2b, aber auch 22.


Passende PHP-Funktionen

In PHP gibt es zwei Funktionen, die meistens im Zusammenhang mit regulären Ausdrücken verwendet werden: preg_match() und preg_replace(). Dabei kommt preg_match() immer dann zum Einsatz, wenn man überprüfen möchte, ob ein regulärer Ausdruck auf eine Zeichenkette passt. preg_replace() wird hingegen immer verwendet, um eine gefundene Zeichenkette durch einen anderen String zu ersetzen. Ihr könnt innerhalb der beiden Funktionen sämtliche verfügbaren regulären Ausdrücke verwenden.

Zunächst ein Beispiel für den Einsatz von preg_match().

<?php
  if (preg_match("/php/i", "Wie findet ihr PHP?.")) {
     echo "PHP wurde gefunden.";
  } else {
     echo "PHP wurde nicht gefunden.";
  }
?>

Hier wird überprüft, ob innerhalb der angegebenen Zeichenkette des Wort PHP enthalten ist.

 
Euch fällt sicherlich das i hinter der Zeichenkette php auf. Darüber wird festgelegt, dass nicht zwischen Groß- und Kleinschreibung unterschieden wird.

Bilder



 
Die zweite Funktion, die sehr oft im Zusammenhang mit regulären Ausdrücken verwendet wird, ist preg_replace(). Mit ihr lassen sich gefundene Zeichenketten durch andere Zeichenketten ersetzen. Ebenso kann gefundener Text aber auch beibehalten werden.

<?php
  $zeichenkette = '20. Mai 2011';
  $suchmuster = '/(d+). (w+) (d+)/i';
  $ersetzung = '${2}1,$3';
  echo preg_replace($suchmuster, $ersetzung, $zeichenkette);
?>

Die Ausgabe sieht folgendermaßen aus:

Bilder



 
Die beiden vorgestellten Funktionen preg_match() und preg_replace() sind PCRE-Funktionen. (Wobei an dieser Stelle noch einmal auf die bereits beschriebenen Regex-Varianten erinnert sei, die PHP unterstützt). Weitere PCRE-Funktionen sind:
  • preg_match_all() – Durchsucht eine Zeichenkette.
  • preg_replace() – Durchsucht und ersetzt in Zeichenketten und Arrays.
  • preg_replace_callback() – Eine spezielle Form von preg_replace().
  • preg_split() – Arbeitet wie explode(), mit dem Unterschied, dass man auch Regex benutzen kann.
  • preg_quote() – Arbeitet wie addslashes(), ist aber für Regex-Zeichen gedacht.
  • preg_grep() – Durchsucht ein Array und liefert die Suchergebnisse als Array zurück.

POSIX-Funktionen gibt es ebenfalls.
  • ereg() – Durchsucht eine Zeichenkette.
  • ereg_replace() –  Durchsucht und ersetzt in Zeichenketten und Arrays.
  • eregi() –  Durchsucht eine Zeichenkette.  (Groß/Kleinschreibung wird nicht berücksichtigt).
  • eregi_replace() – Durchsucht und ersetzt eine Zeichenkette.  (Groß/Kleinschreibung wird berücksichtigt).
  • split()  –  Arbeitet wie explode(), mit dem Unterschied, dass man auch Regex benutzen kann.
  • spliti() –  Funktioniert wie split(). (Groß/Kleinschreibung wird berücksichtigt).
  • sql_regcase() –  Erstellt einen Regex, der für die Suche nach dem angegebenen Wort verwendet werden kann.
Weiterführende Informationen zu den regulären Ausdrücken gibt es beispielsweise unter http://de.wikipedia.org/wiki/Regul%C3%A4re_Ausdr%C3%BCcke.

DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von franzg
  • 14.05.2017 - 23:50

In der Tat ein sehr komplexes Thema. Insofern kann ein solch relativ kurzes Tutorial dies wohl auch nur kurz anreißen. Der Ansatz ist nicht schlecht. Mehr wäre schön! Dank dem Autor für die Mühe!

Portrait von kleckser*1
  • 07.10.2016 - 12:57

Danke für das Tutorial.

Portrait von dmtw2107
  • 16.11.2013 - 09:39

verständlich und toll erklärt danke für das tutorial

Portrait von Curanai
  • 19.09.2011 - 12:00

Zehn "sehr übersichtlich" gehaltene Seiten mit "Beispielen", die auf diese Weise schon im Internet benutzt werden und wohl auch von dort stammen. Keine Silbe zu Variationsmöglichkeiten, simplen Beispielen, Unterscheidungen, wichtigen Hinweisen (double-quotes) etc. Natürlich kann man damit "Bücher" füllen, aber es soll doch bei den Dingern um eine Einführung für den Laien gehen.

Die Beispiele für E-Mail und Datum sind einfach schlecht gewählt.

In meinen Augen ist dies nicht (!) als Einstieg zu gebrauchen, da deutlich viel zu wenig Informationen transportiert werden ... sorry, aber da wäre mehr Einführung hilfreich gewesen, anstatt Links zu Wiki oder der RegEx-Seite.

x
×
×