Regelrechte Ausdrücke
In letzter Zeit bin ich wieder in Lernlaune. Und da ich außerdem mal lesen gelernt habe und es ja jetzt schade wäre, so eine Ausbildung nicht zu nutzen, habe ich mir ein paar Büchern geholt.
Meine letzte Anschaffung war ein Buch über Ausdrücke. Damit, dachte ich mir so, beeindrucke ich dann meinen Rechner und beleidige ein paar Passanten. Dummerweise habe ich mir das Buch in der Computerabteilung der Buchhandlung ausgesucht. Abgesehen davon, dass die EDV-Abteilung zu klein war (ist sie irgendwie immer…) hatte das den Nebeneffekt, dass ich jetzt nicht fluchen, sondern Zeichenketten beschreiben kann.
Probleme und Lösungen
Man sagt über reguläre Ausdrücke (regex), dass sie einem auf den ersten Blick wie die optimale Lösung erscheinen, später aber leicht zu einem eigenständigen Problem heranwachsen können.
Nachdem ich mir die Kurzreferenz durchgelesen habe, habe ich den gleichen Eindruck. Gerade fortgeschrittene Beispiele sind so komplex, dass man schnell den Überblick verliert.
Dabei ist es anfangs ganz leicht: Bei der Überprüfung von Formulareingaben weiß ich, dass die Eingaben einem bestimmten Muster folgen sollten. Telefonnummern sehen doch immer gleich aus, oder? Also versucht man, mithilfe einer regex Telefonnummern zu beschreiben. Wenig später ist man dann soweit, einfach alle Zahlen und einige Sonderzeichen zuzulassen und gibt weitere Strukturmaßnahmen auf. Benutzereingaben können enfach sehr unterschiedlich sein.
Das ist dann der Punkt, an dem man sich wieder auf konventionelle Ausdrücke zurückzieht.
Anders ist es, wenn man z. B. eine e-mail-Adresse auf Gültigkeit prüfen möchte. Da die mail-Adresse von vorneherein einem festen Schema folgt, kann man dieses auch recht genau prüfen. Man muss einfach nur die Regeln, die gelten, als regex ausdrücken und darauf prüfen.
Anfangs habe ich nur auf das vorhandensein von @ geprüft, später kamen dann noch Beschreibungen für die Zeichen davor und danach usw usf. Irgendwann habe ich dann im Internet nach anderen regexen für diesen Zweck gesucht und mein Suchergebnis dann noch ein wenig angepasst.
Das eingangs erwähnte Buch bietet zwar nur eine Syntaxreferenz, was aber für die praktische Arbeit durchaus ausreichen kann. Wenn man weiß, was man erreichen möchte (z. B. eine mail-Adresse überprüfen), dann ist “Reguläre Ausdrücke – kurz & gut” aus dem O’Reilly-Verlag eine gute Wahl.
Mit ein wenig Vorwissen, das man zum Beispiel durch die Anwendung von mod_rewrite sammeln kann, ist es eine angenehme Hilfestellung.
Nur fluchen lernt man durch das Buch nicht. Verdammt.
Codebeispiele
Nur Ziffern und einige Sonderzeichen, die in Telefonnummern üblicherweise zu finden sind, alles in beliebiger Anzahl.
$regex = '{[- 0-9()/+\.]*}';
Beispiel-Regex für eine e-mail-Adresse.
$regex = '/^';
$regex .= '([A-Za-z0-9](([\w.<del>][^._</del>*){0,61})[A-Za-z0-9])@([A-Za-z0-9]([A-Za-z0-9-]{0,61})?[A-Za-z0-9]\.)+([A-Za-z]{2,6})$/';
[edit – 20051231-1502] e-mail-regex angepasst (mein Textile-Plugin hat sie zerstört). Bitte auch Kommentare beachten.
In PHP ist u. a. die Funktion @preg_match@ für einfach Vergleiche zuständig. In JavaScript haben String-Objekte search- und replace-Methoden, die mit regex arbeiten.
Diese PHP-Codebeispiele können gerne weiterverwendet werden, natürlich ohne Garantie auf Erfolg oder Gewährleistung.
View Comments
Kommentar schreiben
Es sind einfache Gestaltungsmittel für die Kommentare erlaubt. Unter anderem:
- Zeilenumbrüche und Absätze (werden automatisch erzeugt)
- Link: "wichtige Webseite":http://wichtigewebseite.de wird zu
wichtige Webseite - Kursiv (als Betonung): _kursiver Text_ wird zu
kursivem Text - Fett (als starke Hervorhebung): *Fettdruck* wird
fett gedruckt
Nochmal: Die e-mail-Adresse wird nie veröffentlicht oder weitergegeben.
Und bevor jetzt irgendeiner spitzfindig wird: Nein, Wordpress formuliert nicht automatisch eure Gramatik um.

Kommentar by Jeena Paradies:
Nunja, dein E-Mail überüfungsregex ist ähm naja, überspitzt gesagt: kaputt ;-)
“Jeena Paradies [A-z0-9.!?#$&%*-/=~^_`’|{}] ”\@\:\; +spam”@locälhöst
ist eine valide E-Mail Adresse :-)
31.12.2005, 15:46
Kommentar by kronn:
Oh. Ich hoffe, das lag an der “Formatierungswut” des Textile-Plugins. Ich habe den Code etwas angepasst, es wird jetzt richtig angezeigt. Ein kurzer JS-Test hat dein Beispiel jetzt zurückgewiesen.
Immerhin ist das ein wunderbares Beispiel für die Probleme, die aus komplexen regex erwachsen können.
Danke für den Hinweis, Jeena.
31.12.2005, 16:11
Kommentar by Boris:
Ups, den Artikel habe ich eben erst entdeckt…
Mit möglichen Regexp für E-Mailadressen habe ich mal vor längerer Zeit beschäftigt – als ich einen Javascript-Filter dafür für ein Kontaktformular basteln wollte. Ziemlich schnell wurde mir klar, dass eine wirklich exakte Definition dessen, was genau eine gültige E-Mailadresse ist, tatsächlich nicht vorliegt. Es gibt offenbar mehrere RFCs zum Thema (nicht nur RFC-822), die aber alle nicht ganz eindeutig eingrenzen. Zumindest bleibt eine Reihe von Unklarheiten.
Der »Regexp-Papst« Jeffrey Friedl hat in seinem O’Reilly-Wälzer »Reguläre Ausdrücke« (1. Aufl. 1998/2000) am Ende einen Ansatz vorgestellt, mit dem man wohl den größten Teil der möglichen Erscheinungsformen von E-Mailadressen erfassen kann:
Der Ausdruck ist 4724 Zeichen lang (ca. 1/3 Buchseute) – danach ist mir schlecht geworden ;-) und ich habe mich schließlich innerlich getrollt und mit einem ziemlich einfachen Muster zufrieden gegeben…
18.01.2006, 22:08
Kommentar by kronn:
Oh, 4000+ Zeichen lang ist wirklich viel. Meine derzeitige Prüfung ist zwar auch nicht wasserdicht, aber genau genug. Letztlich möchte ich nur, dass die Eingaben etwas verwertbarer werden und der Nutzer vielleicht einen Tippfehler noch korrigieren kann.
Dafür reicht mein (gefundener und leicht abgewandelter) Ausdruck auf jeden Fall.
18.01.2006, 23:20