Weblog - kronn.de

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.

h3. 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“:http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html sammeln kann, ist es eine angenehme Hilfestellung.

Nur fluchen lernt man durch das Buch nicht. Verdammt.

h3. 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.-][^._-]*){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@“:http://www.php.net/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.

Abgelegt in: Code
Veröffentlicht am 30.12.2005 um 20:05
Dauerhafter Link zu "Regelrechte Ausdrücke"

  • 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 :-)

  • 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.

  • 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…

  • 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.

Diese Internetseite wurde von Wordpress zusammenebastelt und besteht aus geprüftem XHTML und CSS.
Das hat viele Vorteile.

Weitere Seiten mit ähnlichen Vorteilen preisen gutes Webdesign an oder enthalten Texte.
So ist das Leben eben.
© Kronn/2003-2005

Mein Server hat, nebenbei gesagt, 0,270 Sekunden benötigt, das hier zu fabrizieren.
War aber nicht böse gemeint.


Fatal error: Uncaught Error: Call to undefined function set_magic_quotes_runtime() in /var/www/K1054131198/docroot/kronn.de/etc/counter/counter.php:61 Stack trace: #0 /var/www/K1054131198/docroot/kronn.de/weblog/wp-content/themes/kronn/footer.php(19): include() #1 /var/www/K1054131198/docroot/kronn.de/weblog/wp-includes/template.php(688): require_once('/var/www/K10541...') #2 /var/www/K1054131198/docroot/kronn.de/weblog/wp-includes/template.php(647): load_template('/var/www/K10541...', true) #3 /var/www/K1054131198/docroot/kronn.de/weblog/wp-includes/general-template.php(76): locate_template(Array, true) #4 /var/www/K1054131198/docroot/kronn.de/weblog/wp-content/themes/kronn/single.php(31): get_footer() #5 /var/www/K1054131198/docroot/kronn.de/weblog/wp-includes/template-loader.php(74): include('/var/www/K10541...') #6 /var/www/K1054131198/docroot/kronn.de/weblog/wp-blog-header.php(19): require_once('/var/www/K10541...') #7 /var/www/K1054131198/docroot/kronn.de/weblog/index.php(17): require('/var/www/K10541...') #8 {main} in /var/www/K1054131198/docroot/kronn.de/etc/counter/counter.php on line 61