Websiteentwicklung: PHP: Reguläre Ausdrücke

Mit regulären Ausdrücken werden explizite Eingaben von Benutzern in Formularen auf ihre Korrektheit überprüft. Damit wird überprüft, ob die eingegebene Zeichenkette dem definierten Muster entspricht. Es wird nun ersichtlich, dass einzugebenden Felder innerhalb eines Formulares mit diesen Mustern versehen werden können. Somit wird nicht nur gewährleistet, dass die gewollten Informationen erhalten werden, es entspricht auch dem Sicherheitsaspekt, sich vor diversen Attacken zu schützen.

Einführung

Bearbeiten

Ein regulärer Ausdruck könnte z.B. so aussehen:

/^f(o|a)o$/mi

Die Schrägstriche ("/") agieren hierbei als Delimiter, also als Begrenzer. Man könnte auch Ausrufezeichen o.ä. verwenden. Der gesamte RegEx besteht damit aus zwei Teilen: "^f(o|a)o$" und "mi". "mi" sind Modifikatoren, auf die später eingegangen wird.

In dem ersten Teil des RegEx wird das allgemeine Schema das Suchmusters definiert, prinzipiell besteht es aus aufeinanderfolgenden Gruppierungen, ein String, der gefunden wird, muss daher folgende Kriterien erfüllen: Am Anfang einer Zeile (das Zeichen "^" mit dem Modifikator "m") muss ein "f" stehen, darauf folgt ein Teil, der auf (o|a) passt, darauf folgt ein o und darauf das Ende der Zeile ("$" mit Modifikator "m").

"(o|a)" ist hierbei ein Submuster, in diesem Fall ein simples, es muss entweder ein "o" oder ein "a" folgen. Da dies das erste Submuster im Suchmuster ist, wird der tatsächliche Inhalt (also entweder "o" oder "a") in der Variable \1 abgelegt.

Die Groß- und Kleinschreibung wird auf Grund des Modifikators "i" (ignore case) ignoriert.

Das Suchmuster passt daher auf z.B. folgende Zeilen:

foo
fao
FaO
fOO

Zeichenklassen und klassenartige Konstrukte

Bearbeiten
[...] Irgendein Zeichen aus der Liste
[^...] Irgendein Zeichen, das sich nicht in der Liste befindet
[:Klasse:] Zeichenklasse im POSIX-Stil; nur innerhalb einer Regex Zeichenklasse gültig
. Beliebiges Zeichen außer dem Newline-Zeichen, [^\n]
\C Ein Byte; kann allerdings einen Unicode-Zeichenstream beschädigen
\w Wortzeichen, [a-zA-Z0-9_]
\W Nicht-Wortzeichen, [^a-zA-Z0-9_]
\d Ziffer, [0-9]
\D Nicht Ziffer, [^0-9]
\s Whitespace-Zeichen, [\n\r\f\t ]
\S Nicht Whitespace-Zeichen, [^\n\r\f\t ]

Anker und Zusicherungen der Länge null

Bearbeiten
^ Anfang des Strings bzw. im Mehrzeichenmodus (/m) nach jedem Newline
\A Anfang des Suchstrings in allen Match-Modi
$ Ende des Strings oder vor einem den String abschließenden Newline
\G Anfang der aktuellen Suche
\b Wortgrenze
\B Nicht-Wortgrenze
(?=...) Positives Lookahead
(?!...) Negatives Lookahead
(?<=...) Positves Lookbehind
(?<!...) Negatives Lookbehind

Kommentare und Modus-Modifikationen

Bearbeiten
i Groß-/Kleinschreibung ignorierendes Matching
m ^ und $ greifen auch neben eingebettetem \n
s Punkt (.) erkennt Newline
x Ignoriert Whitespace und erlaubt Kommentare (#) in Mustern.
U Kehrt die >>Gier<< aller Quantoren um: * wird nicht-gierig und *? gierig.
A Matching beginnt am Anfang der Suche
D $ greift am Ende Strings und nicht vor dem newline, das den String abschließt.
u Betrachtet regulären Ausdruck und Subject-Strings als Strings in Multibyle-UTF-8-Zeichen
(?#...) Betrachet Substrings als Kommentar
#... Betrachet den Rest der Zeile als Kommentar

Gruppierung

Bearbeiten
(...) Gruppierung von Submustern
(?P<Name>) Submuster gruppieren und Subtreffer in benannter Capture-Gruppe Name festhalten
\n Enthält das Ergebnis des n-ten vorangegangen Subtreffers einer geklammerten oder benannten Capture-Gruppe
(?:...) Submuster gruppieren, aber keine Subtreffer festhalten
(?>...) Backtracking für durch Submuster erkannten text deaktivieren
... Submuster in Alternativen probieren
* Keinmal oder mehrmals
+ Einmal oder mehrmals
? Einmal oder keinmal
{n} Genau n-mal
{n,} Mindestens n-mal
{x,y} Mindestens x-mal, aber nicht öfter als y-mal
*? Keinmal oder mehrmals, aber so wenig wie möglich
+? Einmal oder mehrmals, aber so wenig wie möglich
{n,}? Mindestens n-mal, aber so wenig wie möglich
{x,y}? Mindestens x-mal, nicht mehr als y-mal und so wenig wie möglich
*+ Kein- oder mehrmals und kein Backtracking
++ Einmal oder mehrmals und kein Backtracking
?+ Kein- oder einmal und kein Backtracking
{n}+ Genau n-mal und kein Backtracking
{n,}+ Mindestens n-mal und kein Backtracking
{x,y}+ Mindestens x-mal, nicht mehr als y-mal und kein Backtracking

Die PHP-Funktionen

Bearbeiten

preg_match()

Bearbeiten
<?php
$datum = '01-03-2004';
if (preg_match('/^(\d{2})-(\d{2})-(\d{4})$/', $datum, $wert)){
    echo $wert[0];
} else {
    echo 'Ungültiges Datumsformat: '.$datum;
}
?>

Zuerst wird eine Variable $datum mit einem Datumsmuster versehen. Alle eingegebenen Datumsmuster müssen dem obigen Muster entsprechen, ansonsten wird die in else eingegebene Funktion ausgegeben.

preg_replace()

Bearbeiten
$string = '[[image:foo.jpg|Alternativtext]]';
$string = preg_replace('/\[\[image:(.+)\|(.+)\]\]/i', "<img src='$1' alt='$2'/>", $string);

Ersetzt in einem String Wiki-formatierte Bilder nach HTML.

Bearbeiten