PHP/MySQL - Reguläre Ausdrücke - Beispiele
1. Die Abschnitte
- Einführung
- Befehle
- Grundlagen Teil 1
- Grundlagen Teil 2
- Der Backslash (\)
- Klammern
- Gierig und ungierig
- Rückbezüge
- Beispiele
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.