Hauptmenü

Untermenü

PHP/MySQL - Reguläre Ausdrücke - Beispiele

1. Die Abschnitte

2. Postleitzahlen überprüfen


<?php
  $plz ' Meine PLZ ist 50678';
  if (preg_match ("/[0-9]{5}/"$plz$hit))
  {
    print_r ($hit);
  }
?>

Erläuterung

Ist ganz einfach, [0-9] steht für Zahlen und {5} legt fest, dass es genau fünf sein sollen.

3. Telefonnummern überprüfen

Hier wird es schon ein wenig komplizierter, da es mehrere Varianten geben kann also zum Beispiel so was wie + 49 (0)202 / 12345 - 67 oder auch 0170 2345678. Spielt die verschiedenen Nummern im folgenden Beispiel einfach mal durch.


<?php
  $telefon '+49 (0)202 / 12345 - 67';
  $telefon '0170 345678';
  $telefon '0221 56789';

  $pattern "/^(\+[0-9]{2,3}|0+[0-9]{2,5}).+[\d\s\/\(\)-]/";
  if (preg_match ($pattern$telefon$hit))
  {
    print_r ($hit);
  }
?>

Erläuterung

Zu Beginn konzentrieren wir uns auf Vorwahlnummern. Die können Länder-, Orts- oder Netz-spezifisch sein. Eingeleitet wird das durch ^ und bezieht sich auf den Anfang der Zeichenkette. Dann treffen wir eine Fallunterscheidung mit (...|...). Der erste Teil \+[0-9]{2,3} überprüft, ob der String mit einen +-Zeichen beginnt, gefolgt von zwei oder drei Zahlen. Als Alternative untersuchen wir im zweiten Teil mit 0+[0-9]{2,5}, ob die Zeichenkette mit einer 0 anfängt, der zwei bis fünf weitere Zahlen folgen. Allerdings muss ich zugeben, dass ich mich hier vor allem an deutschen Telefonnummern orientiere.

Mit .+[\d\s\/\(\)-] überprüfen wir den Rest der Zeichenkette. Allerdings habe ich aus didaktischen Gründen hier mal das \d für Zahlen genommen. Des Weiteren sind Leerzeichen (\s), Schrägstriche (\/, Klammern (\(\)) und der Bindestrich erlaubt. Achtet immer darauf, spezielle Zeichen mit dem \ zu escapen. Beim Schrägstrich mussten wir das tun, weil wir den auch als Delimiter einsetzen.

4. Eine syntaktisch korrekte E-Mail überprüfen


<?php
  $check "/^[_a-z0-9-.]*@[_a-z0-9-.]*\.[a-z]{2,4}$/i";
  $mail 'mail@peterkropff.de';
  $mail 'geiler_stecher123@superboys.einsame-schweine.info';
  $mail 'super.braut@dicke-moepse.einsame_luder.biz';
  if (preg_match ($check$mail$hit))
  {
    print_r ($hit);
  }
?>

Erläuterung

Mit ^[_a-z0-9-.] überprüfen wir, ob der erste Teil der E-Mail aus korrekten Zeichen besteht, Also Buchstaben von A bis Z (ohne Sonderzeichen) sowohl dem Unter- und Bindestrich. Der Quantifier * sorgt dafür, dass nach beliebig vielen Zeichen gesucht werden kann. Anschließend erwartet unser regulärer Ausdruck das obligatorische @-Zeichen.

Hinter dem @ kommt dann wieder die Überprüfung von erlaubten Zeichen, wie gehabt [_a-z0-9-.]*. Dann wird zwingend ein Punkt erwartet (\., gefolgt von zwei bis vier Buchstaben ([a-z]{2,4}). Und dass nach denen nicht mehr kommen soll, dafür sorgt unser $-Zeichen, dass das Ende der Zeichenkette markiert. Mit dem Modifier i wird die Überprüfung nach Groß- und Kleinbuchstaben abgestellt.

Einige von euch werden sich jetzt sicher fragen, warum wir in den Charakterklassen den Punkt nicht maskiert haben. Die Erklärung ist einfach, wenn auch ein wenig unlogisch, weil der am Ende steht. Ansonsten müsste er natürlich mit dem Bachslash (\) "escaped" werden.

Hinweis

Das obige Beispiel ist nicht besonders genau. So erlaubt unser Ausdruck zum Beispiel, dass eine E-Mail auch mit einem Punkt beginnen kann, was in der Praxis natürlich nicht möglich ist. Aber diesen Fehler könnt ihr ja jetzt sicher selber bereinigen ;-).

5. Und jetzt ganz was feines

Im Abschnitt über Rückbezüge habe ich gezeigt, wie man großgeschriebene Tags erkennen kann. Will man nun alle XHTML-konform in Kleinbuchstaben umwandeln. so geht das folgendermaßen.


<?php
  $string '<A name="bla">bla</A> oder <P>blubb</P> 
              oder <A name="laber">laber</A><H1>sülz</H1>
              <B class="superfett">und noch etliches weitere</B>';
  $suchen '/<([A-Z0-9]{1,})[^>]*>.*<\/\1>/';
  $newstring preg_replace_callback (
                                      $suchen, 
                                      create_function 
                                      (
                                        '$hits',
                                        'return strtolower($hits[0]);'
                                      ), 
                                      $string
                                     );
  echo $newstring;
?>

Erläuterung

$suchen

Der erste geklammerte Ausdruck ([A-Z0-9]{1,}) bedeutet, dass man nach Großbuchstaben und Zahlen sucht, wobei das Pattern mindestens eines von beiden erwartet. Mit [^>]* sagen wir, dass zwar noch verschiedene Zeichen kommen dürfen aber kein >, damit wir ein komplettes Tags (<...>) erkennen können.

Als nächstes können dann beliebige Zeichen kommen (.*), die uns obendrein nicht interessieren. Und am Ende arbeiten wir mit einem Rückbezug, der sich auf das Ergebnis des ersten geklammerten Patterns bezieht: <\/\1>. Da es sich dabei nur um Anweisungen für HTML-Tags, wie zum Beispiel h1 oder table handeln kann, haben wir sofort den Inhalt des schließenden Tags ermittelt. Gut, dieses Beispiel setzt validen Code voraus, aber der sollte ja mittlerweile selbstverständlich sein.

preg_replace_callback

Anstelle eines "Ersetzen"-Ausdrucks verwendet man hier eine Art temporärer Funktion, die nichts anderes macht, als die Treffer in Kleinbuchstaben zurückzugeben. Und das Ergebnis wird dann von preg_replace_callback zum ersetzen genutzt. Ich selber brauchte das mal, als es darum ging, uralten HTML-Code von den anno dunnemals üblichen groß geschrieben Tags zu befreien und in die heute übliche Kleinschreibweise umzuwandeln.

6. Ein Hinweis

In diesem Tutorial bin ich auf viele Dinge noch nicht eingegangen. Allerdings werde ich die irgendwann nachreichen. Versprochen. Kann allerdings ein wenig dauern, da ich noch andere Themen vorziehen möchte.

zurück zum vorherigen Abschnitt