RegEx:
Reguläre Expressions
Reguläre Ausdrücke beschreiben Strings analytisch nach Mustern. Damit wird dann ein gegebener String verglichen, auf einen 'match' geprüft. Ohne einen String genau zu kennen, kann ich doch Regeln aufstellen, denen er zu genügen hat. Benutzt werden Perl-kompatible RegEx auch in PHP und JavaScripts.
RegEx stellen fest, ob ein Zeichen /n/ am Anfang oder am Schluss eines Strings steht,
wieviele Zeichen davor stehen, von wievielen Zeichen es gefolgt wird, von was für welchen,
ob es Versal oder klein ist, ob es eine Zahl ist, wie oft es vor kommt, etc.
Ein bekanntes Beispiel ist eine E-Mail Adresse, deren Gesetzmässigkeit etwa so beschrieben werden kann:
Es hat nur ein @-Zeichen, das nicht am Anfang steht, und von mehreren Zeichen gefolgt wird,
bis ein Punkt kommt gefolgt von mindestens zwei Zeichen. (Siehe Beispiele am Ende der Datei.)
Aufbau
- Eine RegEx ist selbst ein String und steht in einfachen Anführungszeichen (Hochkomma).
- Er hat ein Startzeichen und ein gleiches Endzeichen (Delimiter), meisst der / (slash). Falls der Slash als Delimiter benutzt wird, müssen andere Slashes im RegEx-String (etwa bei einer URL) durch einen Backslash \/ escaped werden, oder man benutzt | oder % als Delimiter.
- Dazwischen befinden sich Ausdrücke, gruppiert durch () (Klammern). Jede dieser Gruppen werden zwischengespeichert und können wiederverwendet werden.
- Nach dem Endzeichen, kommt ein Modus-Modifikator, welcher gesammt Kriterien anwendet wie 'beachte die Gross-/Kleinschreibung nicht'.
Metazeichen
Für alle diese Gesetze gibt es Metazeichen, also Symbole oder Abkürzungen für Aussagen.
RegEx
^ Anfang eines Strings
$ Ende eines Strings
. ein beliebiges Zeichen
n? optional vorhandenes 'n'
n* Kein oder mehrfaches Vorkommen von 'n'
n+ Ein oder mehrere Vorkommen von 'n'
* Keinmal oder mehrmals
? Einmal oder keinmal
*? Keinmal oder mehrmals, aber so wenig wie möglich
# Betrachet den Rest der Zeile als Kommentar
{} Präzisierung
{n} Genau n-mal
n{2} Genau zweifaches Vorkommen von 'n'
{n,} Mindestens n-mal
n{2,} Mindestens 2 oder mehrere Vorkommen von 'n'
{x,y} Mindestens x-mal, aber nicht öfter als y-mal
n{2,4} Mindestens 2, höchstens 4 Vorkommen von 'n'
{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
() Ausdrücke, Gruppen, Substring, Submuster
(n|a) Entweder 'n' oder 'a'
(x|y|z) Entweder 'x' oder 'y' oder 'z'
(Marcel|Biefer) Entweder 'Marcel' oder 'Biefer'
(?#) Betrachet Substrings als Kommentar
(?P<Name>) Submuster gruppieren und Subtreffer in benannter Capture-Gruppe Name festhalten
[] Zeichenklasse, Liste oder von - bis
[abc] a,b oder c
[1-6] eine Zahl zwischen 1 und 6
[^] Irgendein Zeichen, das sich nicht in dieser Liste befindet
[^0-9] keine Zahl
[c-h] ein Kleinbuchstabe zwischen c und h (c,d,e,f,g,h)
[D-H] ein Großbuchstabe zwischen D und H (D,E,F,G,H)
[^a-z] kein Kleinbuchstaben
[_a-zA-Z] ein Unterstrich und ein beliebiger Buchstabe des Alphabets
[:space:] Leerzeichen
PCRE Zeichenklassen
\ Escape-Zeichen für alle Zeichen mit Sonderbedeutung die oben zu sehen sind und unten noch folgen
\b Wortgrenze
\B Nicht-Wortgrenze
\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 ]
Modus-Modifikationen
i Groß-/Kleinschreibung ignorierendes Matching
U umschalten auf nicht greedy (nicht gierig)
m ^ und $ greifen auch neben eingebettetem \n
s Punkt (.) erkennt Newline
x Ignoriert Whitespace und erlaubt Kommentare (#) in Mustern.
Beispiel Schnippsel
Mindestens ein Buchstabe, eine Zahl oder ein Unterstrich
^[a-zA-Z0-9_]{1,}$
Irgend ein Zeichen, aber kein Buchstabe und keine Zahl
[^A-Za-z0-9]
Passwort mit mindestens 8 Zeichen, mindestend ein kleingeschriebenes und ein grossgeschriebenes Zeichen und eine Ziffer
^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$
E-Mail Adresse wie vorname.nachname@abteilung.firma.com
^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$
E-Mail Adresse unterteilt
$name = '[a-zA-Z0-9]((\.|\-)?[a-zA-Z0-9])*';
$domain = '[a-zA-Z]((\.|\-)?[a-zA-Z0-9])*';
$tld = '[a-zA-Z]{2,8}';
$email = '^('.$name.')@('.$domain.')\.('.$tld.')$';
Gültige Zeichen definieren für codefreien Text
$text = '[a-zA-Z0-9ÄÖÜäöüß|.|:|!|?|+|-|*|/|_| ]+';
$regEx = '^'.$text.'$';
Ungültig sind somit alle oben nicht erwähnten wie: ()[]<>\|#'"&%=@;
RegEx in PHP
In PHP gibt es spezielle Funktionen, um mit Regulären Ausdrücken zu arbeiten:
preg_match(), preg_match_all(), preg_grep(), preg_replace(), preg_replace_callback(), preg_split()
Weitere Anwendungen: preg_match() und preg_replace(), zum Suchen und Ersetzen.
Tags analysieren: PHP analysiert HTML Struktur
Obige Perl compatiblen (PCRE) Funktionen ersetzen seit PHP 4.2 die veralteten und seit PHP 5.3 unerwünschten Unix (POSIX) Funktionen:
ereg(), eregi(), ereg_replace(), eregi_replace()
Alle PHP Funktionen die mit ereg beginnen darf ich nicht mehr verwenden, in PHP 6 werden sie nicht mehr funktionieren!