joerghuelsermann.de Reguläre Ausdrücke in der Praxis

Reguläre Ausdrücke in der Praxis

Nachfolgend sind mehrere reguläre Ausdrücke die ich zu bestimmten Zeitpunkten benötigt hatte. Das wichtigste ist bevor man anfängt einen regulären Ausdruck zu entwickeln das man sich eingehend vorher informiert, was alles zu beachten ist. Die regulären Ausdrücke setze ich im allgemeinen in Anführungszeichen und escape diese dann auch wieder wenn ich diese abfrage. Genauso verhält es sich mit dem Rautenzeichen welches ich für die Abgrenzung des regulären Ausdrucks in den meisten Fällen verwende.

Abfrage einer Webseite

Links finden

Um Links in HTML, XHTML oder SVG Dateien aufzuspüren, eignet sich folgender Ausdruck. Dabei werden auch area Elemente neben den üblichen a Elementen erfasst. #<a(rea)?[\s][^<]*href=["|\'](?P<href>[^"|\']*)["|\'].*>#Uis Die Untergruppe sorgt dafür das für das Linkziel eine zusätzliche Datenreihe angelegt wird. Zur Anwendung kommt dieser Ausdruck auf Links Überprüfen. Mir ist bewusst das damit nicht alle Links unter HTML möglicherweise erfasst werden.

Überprüfung eines Content Type

Um die Ausführung auf spezielle Seiten zu begrenzen, die auf HTML, XHTML oder SVG basieren, dient zur Überprüfung folgender regulärer Ausdruck. #text/html|application/xhtml\+xml|image/svg\+xml#is

XML

Selbstschließende Elemente in XML

Um selbstschließende Elemente unter XML mit der richtigen Syntax zu erfassen sollte man folgende reguläre Ausdrücke miteinander vergleichen. #<[^<]*/>#Us gibt zuerst alle Elemente zurück. Mit #<[^<]* />#Us erfasst man nur die Elemente mit der richtigen Syntax. Dieser reguläre Ausdruck findet auf XHTML Test seine Anwendung.

Entitäten in XML

Erlaubte und notwendige Entitäten und deren Unicode Entsprechungen in XML bestehen aus den drei Zeichen &,< und >. Folgende Möglichkeit erfasst alle Schreibweisen als benannte Entitäten und Unicode in dezimaler und hexadezimaler Schreibweise auch mit führenden Nullen.

#&(amp|\#0*38|\#x0*26|lt|\#0*60|\#x0*3c;|gt|\#0*62|\#x0*3e);#i

Benötigt habe ich diesen Ausdruck auf Verwendete Entitäten.

XHTML

Doctype XHTML

Zur Erkennung von Dokumententypen benötigte ich auf dem XHTML Test verschiedene Abfragen. Da laut Spezifikation Leerzeichen auch Zeilenwechsel repräsentieren ergaben sich folgende reguläre Ausdrücke.

  • #<!DOCTYPE[\s]html.*># XHTML5 für HTML5 wird keine spezielle Schreibweise benötigt.
  • #<!DOCTYPE[\s]+html[\s]+PUBLIC[\s]+"-//W3C//DTD[\s]+XHTML[\s]+1.0[\s]+Strict//EN"[\s]+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">#i XHTML 1.0 Strict
  • #<!DOCTYPE[\s]+html[\s]+PUBLIC[\s]+"-//W3C//DTD[\s]+XHTML[\s]+1.0[\s]+Transitional//EN"[\s]+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">#i XHTML 1.0 Transitional
  • #<!DOCTYPE[\s]+html[\s]+PUBLIC[\s]+"-//W3C//DTD[\s]+XHTML[\s]+1.0[\s]+Frameset//EN"[\s]+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">#i XHTML 1.0 Framest
  • #<!DOCTYPE[\s]+html[\s]+PUBLIC[\s]+"-//W3C//DTD[\s]+XHTML[\s]+1.1//EN"[\s]+"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">#i XHTML 1.1
  • #<!DOCTYPE[\s]+html[\s]+PUBLIC[\s]+"-//W3C//DTD[\s]+XHTML[\s]+Basic[\s]+1.1//EN"[\s]+"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">#i XHTML 1.1 Basic

Datum

Eingabe eines Datums überprüfen

Ein Datum in der Schreibweise Jahr-Monat-Tag wollte ich kontrollieren auf meinen Artikel zur Berechnung von Sternzeichen durch PHP. An diesem Beispiel sieht man aber auch wie ausgereift ein regulärer Ausdruck werden kann. Die Frage die man sich immer stellen muss wie nötig ist ein komplexerer Ausdruck gegenüber einem einfach formulierten regulären Ausdruck.

  • #^\d{4}-\d{2}-\d{2}$# Stufe 1 begrenzt nur das Format der Eingabe.
  • #^\d{4}-(0[1-9]|1[012])-(0[1-9]|[12]\d|3[01])$# Stufe 2 begrenzt die Eingabe schon mal auf sinvollere Eingaben, die keine gravierenden Fehler bei der Weiterverabeitung mit PHP hervorrufen.
  • #^\d{2}([13579][26]|[02468][048])-02-29$|^\d{4}-(0[13578]|1[02])-(0[1-9]|[12]\d|3[01])$|^\d{4}-(0[469]|11)-(0[1-9]|[12]\d|30)$|^\d{4}-02-(0[1-9]|1\d|2[0-8])$# Stufe 3 lässt nur sinnvolle existierende Eingaben zu einem Datum zu.

Wenn man dann aber über die entsprechende PHP Funktion checkdate stolpert, ist dieser regulärer Ausdruck wohl nur noch als Beispiel für den Aufbau eines Ausdruckes geeignet.

Perry Rhodan Sammelkartenspiel

Aktionskarten

Um die Übergabe eines Parameter zu kontrollieren habe ich diesen speziellen Ausdruck der in einem anderem Hobby von mir Verwendung findet formuliert. Der Ausdruck darf am Anfang nur eine 1-5 enthalten gefolgt von 72 Ziffern die nur bei 0 bis 4 gültig sind. #^[1-5][0-4]{72}$# Diese Anwendung ist sehr speziell und hat mit den Regeln des Perry Rhodan Sammelkartenspieles zu tun. Angewendet wird dieser reguläre Ausdruck auf dem Deckcheck für die Aktionskarten.

htaccess

Als Filter einsetzen

Eine sehr hilfreiche Anwendung von regulären Ausdrücken besteht im Einsatz in der htaccess Datei. Einmal habe ich die regulären Ausdrücke eingesetzt um hexadezimale Farbwerte zu einer anderen Seite umzuleiten RewriteRule ^rgb([a-f0-9]{6})$ http://joerghuelsermann\.de/farbe/$1 [R=301,L]. Öfter verwende ich aber reguläre Ausdrücke wirklich für solche Fälle um bestimmte Eingaben bereits durch die htaccess Datei zu filtern. Um zum Beispiel noch einen zusätzlichen Schutz für Datenbanken zu gewährleisten.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(\w+)$ /seite.php?seite=$1 [QSA]