Reguläre Ausdrücke
Sinn und Zweck
In der EDV sind reguläre Ausdrücke eine Zeichenkette, die wie eine Art Filter gegen einen anderen Text gegengecheckt werden. Somit können bestimmte Textteile wie z.B. Mailadressen in größeren Texten gefunden werden, oder überprüft werden ob eine Eingabe einer bestimmten Form entspricht. In diesem Tutorial werden wir reguläre Ausdrücke aus den verschiedensten Blickwinkeln betrachten.
Anwendungsmöglichkeiten
- Eingabevalidierung in Kontakt- und Anmeldeformularen.
- Überprüfung von übergebenen Parametern zur Abwehr von SQL-Injektions
- Komplexe "Suchen und Ersetzen" Aufgaben
- Betrieb von Virenscannern
- E-Mail oder Linkspidering
- Formatumwandlungen z.B. Datumswerte oder Apachemodul ModRewrite
Begriffsherkunft
Bei dem Begriff "Regulärer Ausdruck" ist die Übersetzung des englischen Ausdrucks "regular expression". Man hätte ihn auch mit "Ausdruck mit Regeln" übersetzen können.
Muster für reguläre Ausdrücke
- abc repräsentiert genau die jeweiligen Zeichen.
- [abc] Eckige Klammern stellen eine Auswahl an möglichen Zeichen zur Verfügung. So könnte [LB]ock beispielsweise für "Lock" oder "Bock" stehen.
- [a-z] repräsentiert eine "von bis" Angabe. In der hier gesuchten Zeichenfolge können alle kleinen Buchstaben vorkommen. [0-9] hingegen meint alle Zahlen. Eine solche Angabe kann auch gemischt werden. [a-fl] zeigt alle Zeichen von a-f und das kleine L. Genauso können mehrere Bereiche angegeben werden. Hier eine Zeichenfolge für alle hexadezimalen Zahlen: [0-9a-fA-F] .
- [^abc] stellt eine Liste von Zeichen dar, die nicht vorkommen dürfen. So trifft [^B]us auf "Mus" zu, nicht aber auf "Bus"
- . (ein Punkt) repräsentiert irgend ein Zeichen.
Wenn Sie in den regulären Ausdrücken die Steuerzeichen – + ? * ( ) [ ] { } / \ | , . ^ $ mit verwenden wollen, müssen Sie einen Backslash \ vor das Zeichen stellen. Es wird dann nicht mehr als Steuerzeichen interpretiert.
Quantifizierer
- ? Steht ein ? rechts von einem Zeichen, einer Liste oder einem geklammerten Ausdruck, so darf der entsprechende Ausdruck vorkommen, oder auch nicht. Er ist also optional. Schr?ank könnte also für "Schrank" oder "Schank" stehen.
- * Steht das * Zeichen rechts von einem Zeichen oder Ausdruck, dann kann das Zeichen oder der Ausdruck beliebig oft vorkommen, oder gar nicht. Es würden also sowohl 256 als auch 25556 auf den Ausdruck 25*6 passen.
- + Das Pluszeichen bedeutet, dass das links davon stehende Zeichen oder der Ausdruck mindestes 1x vorkommen muss. Er kann auch öfter vorkommen. 0,7+ ist also eine Zahl mit beliebig vielen 7er am Ende, aber mit mindestens einem.
Zu den Quantifizierern * und + ist noch zu sagen, dass sie, wenn sie die Wahl haben, immer den Treffer mit der meisten Anzahl an Treffern zeigen. Man sagt auch, sie sind "gierig". Genauso gibt es auch nicht gierige Varianten. *? und +?. Diese zeigen immer das Ergebnis mit dem kleinsten Treffer.
- {n} ist eine Mengenangabe. Es heißt, dass das links davon stehende Zeichen genau n-mal vorkommen muss. [0-9]{5} würde dann z.B. auf eine deutsche Postleitzahl passen.
- {m,n} hingegen ist eine "von bis" Angabe. Das entsprechende Zeichen muss mindestens m-mal und darf maximal n-mal vorkommen. So würde [0-9]{4,8} eine Telefonnummer ohne Vorwahl finden.
- {m,} Der Ausdruck muss mindestens m-mal vorkommen.
- {,n} Der Ausdruck darf maximal n-mal vorkommen.
Zeichenklassen
Es gibt ebenso bestimmte Zeichenklassen, die eine bestimmte Menge an Zeichen repräsentieren.
- \s repräsentiert ein beliebiges Whitespace. Ein Whitespace ist ein Leerzeichen, Tabulator oder Zeilenumbruch.
- \w steht für alles, was in einem Wort vorkommen kann. (Buchstaben, Ziffern und der Unterstrich).
- \W Das Gegenteil von \w. Es entspricht allen anderen Zeichen.
- \d steht für Zahlen. Also [0-9].
- \D ist alles, was keine Zahl ist. Also [^0-9].
- \b entspricht dem Zwischenraum (auch Wortgrenze) zwischen 2 Wörtern. So trifft zum Beispiel der Ausdruck \bsch auf "schieben" zu, nicht aber auf ""mischen".
- \B trifft auf jedes Zeichen zu, das nicht am Anfang oder Ende eines Wortes steht. \Bsch würde also auf "mischen" zutreffen, nicht aber auf "schieben".
- ( ) Mit den runden Klammern kann ein Teilausdruck zu einer Gruppe zusammengefasst werden. Auf diese Gruppe wiederum können dann Quanifizierer wie z.B. +,? und * angewendet werden oder mittels | verschiedene Optionen angegeben werden. Weiter werden alle geklammerten Ausdrücke als Untermenge des gefundenen Ergebnisses in den Variablen $1 bis $9 gespeichert.
- ^ steht für den Zeilenanfang
- $ steht für das Zeilenende.Wird ein Ausdruck mit diesen beiden Zeichen begrenzt, so werden keine Treffer aus der Mitte des Suchtextes gefunden. Einen Treffer gibt es nur, wenn die ganze Zeile mit dem Ausdruck übereinstimmt.
Variablen
Für jede gesetzte Klammer wird automatisch eine Variable angelegt. Wird zum Beispiel der Text "53229 Bonn" durch den Ausdruck (\d{5})[ ]([a-z]+) gejagt, so steht in Variable $1="53229" und in Variable $2="Bonn". Dies ist z.B. wichtig für die automatische Linkumschreibung des Apache Webservers. Die Linkumwandlung wird später noch erklärt.
Praxisnahe Ausdrücke
Validierung Name oder Vorname
^([A-Za-züöäÜÖÄß \-]){3,100}$
- ^ String-Anfang
- A-Za-z Es dürfen alle Buchstaben vorkommen.
- üöäÜÖÄ Es dürfen Umlaute vorkommen.
- ß Es darf das scharfe ß vorkommen.
- Es darf ein Leerzeichen vorkommen.
- \- Es darf ein Bindestrich vorkommen. Der Bindestrich ist ein Funktionszeichen und muß daher durch den Backslash geschützt werden.
- {3,100} Der Ausdruck muß mindestens 3 Zeichen und maximal 100 Zeichen haben
- $ String-Ende
Validierung Straße
^[A-Za-züöäÜÖÄß \/\.\-]{3,100}$
- ^ String-Anfang
- [A-Za-züöäÜÖÄß \/\.\-] Es dürfen Buchstaben, Zahlen, Umlaute, das Scharfe S, Leerzeichen, Schrägstriche, Punkte und Bindestriche vorkommen.
- {3,100} Es müssen mindestens 3 und maximal 100 Stellen vorkommen.
- $ String-Ende
Validierung Hausnummer
^[0-9a-zA-Z \-]{1,5}$
- ^ String-Anfang
- [0-9a-zA-Z \-] Es dürfern Zahlen, Buchstaben, Leerzeichen und Bindestriche vorkommen.
- {1,5} Es muß aus mindestens einem und maximal 5 Zeichen bestehen.
- $ String-Ende
Validierung URL
^(http(s)?:\/\/)?(www\.)?([a-zäüöA-ZÖÄÜ]((\.|\-)?[a-zöäüA-ZÄÖÜ0-9])*)\.([a-zA-Z]{2,8})[a-zA-Z0-9\_\+\.\/\-]*$
- ^ String-Anfang
- (http(s)?:\/\/)? Es kann ein http:// vorkommen oder auch nicht. Das "s" ist wiederum durch den Ausdruck (s)? optional.
- (www\.)? Danach kann ein www. vorkommen oder auch nicht.
- ( Blockanfang
- [a-zäüöA-ZÖÄÜ] Es folgt ein Buchstabe oder Umlaut.
- ((\.|\-)?[a-zöäüA-ZÄÖÜ0-9])* Dann folgt ein Punkt/Bindestrich oder auch nicht und wieder beliebig viele Buchstaben oder Zahlen. Dieser Block kann beliebig wiederholt werden. (Subdomains)
- ) Blockende
- \.([a-zA-Z]{2,8}) Danach muß ein Punkt kommen, der von mindestens 2 und maximal 8 Buchstaben gefolgt wird.
- [a-zA-Z0-9\_\+\.\/\-]* Um noch eventuelle Unterordner oder Seiten abzudecken, darf dann optional noch eine beliebig lange Folge von Buchstaben, Zahlen,Unterstrichen, Pluszeichen, Punkten, Schrägstrichen und Bindestrichen kommen.
- $ String-Ende
Validierung E-Mail
^([a-zA-Z0-9]((\.|\-|_)?[a-zA-Z0-9])*)@([a-zöäüA-ZÖÄÜ]+((\.|\-)?[a-zöäüA-ZÖÄÜ0-9]+)+)\.([a-zA-Z]{2,8})$
- ^ String-Anfang
- ( Blockanfang
- [a-zA-Z0-9] Ein Buchstabe oder eine Zahl
- ( Blockanfang
- (\.|\-|_)? Es kann vorkommen ein Bindestrich, Unterstrich oder ein Punkt, muß aber nicht.
- [a-zA-Z0-9] Es folgt ein Buchstabe oder eine Zahl
- )*) 2* Blockende der oberen beiden Zeilen kann beliebig oft vorkommen oder auch gar nicht.
- @ @-Zeichen
- ( Blockanfang
- [a-zöäüA-ZÖÄÜ] Ein Buchstabe oder Umlaut
- ( Blockanfang
- (\.|\-)? Es kann vorkommen ein Bindestrich oder ein Punkt, muß aber nicht.
- [a-zöäüA-ZÖÄÜ0-9]+ Es folgt mindestens ein Buchstabe, Umlaut oder Zahl.
- )+) 2* Blockende der oberen beiden Zeilen kann beliebig oft vorkommen oder auch gar nicht.
- \. Es folgt ein Punkt
- ([a-zA-Z]{2,8}) und dann noch 2-8 Buchstaben als TLD
- $ String-Ende
Validierung Telefonnummer großzügig
^[0-9\+\/\(\) \-]{5,30}$
- ^ String-Anfang
- [0-9\+\/\(\) \-] Es dürfen Zahlen, Pluszeichen, Schrägstriche, Klammern, Leerzeichen und Bindestriche vorkommen.
- A-Za-z Es müssen mindestens 5 und dürfen maximal 30 Zeichen vorkommen.
- $ String-Ende
Validierung Telefonnummer genau
^\+{1}[0-9]{1,4}\-[0-9]{3,6}\-[0-9]{3,10}$
- ^ String-Anfang
- \+{1} Genau ein Pluszeichen.
- [0-9]{1,4} Zwischen 1 und 4 Zahlen für die Ländervorwahl.
- \- Genau ein Bindestreich.
- [0-9]{3,6} Zwischen 3 und 6 Zahlen für die Ortsvorwahl.
- \- Genau ein Bindestreich.
- [0-9]{3,10} Zwischen 3 und 10 Zahlen für die eigentliche Telefonnummer und die Durchwahl.
- $ String-Ende
Andere oder noch genauere Muster für Telefonnummern sind natürlich auch möglich.
Validierung Ganzzahl
^[0-9]+$
- ^ String-Anfang
- [0-9]+ Es muß mindestens eine Zahl vorkommen.
- $ String-Ende
Das Ganze kann natürlich auch stellenmäßig eingeschränkt werden.
^[0-9]{2,10}$
- ^ String-Anfang
- [0-9]{2,10} Es müssen mindestens 2 und maximal 10 Zahlen vorkommen.
- $ String-Ende
Validierung Kommazahl
^[0-9]+[\,\.][0-9]+$
- ^ String-Anfang
- [0-9]+ Es muß mindestens eine Zahl vorkommen.
- [\,\.] Dann ein Komma oder ein Punkt.
- [0-9]+ Es muß mindestens eine Zahl vorkommen.
- $ String-Ende
Hier wieder eine Variation mit einer vorgeschriebenen Anzahl an Stellen. Würde auch ganze Zahlen zulassen.
^[0-9]{1,10}[\,\.]?[0-9]*$
Reguläre Ausdrücke und PHP
Wichtige Befehle
- preg_match() Zerlegt eine Zeichenkette anhand eines regulären Ausdrucks.
- preg_match_all() Führt eine umfassende Suche nach Übereinstimmungen mit regulärem Ausdruck durch.
- preg_replace() Sucht und ersetzt einen regulären Ausdruck.
Codebeispiele
Hier einmal eine komplette Validierungsfunktion:
function validateTel($String)
{
$reg_muster="^[0-9\+\/\(\) \-]{5,30}$";
if (ereg($reg_muster,$String))
{return true;}
else
{return false;}
}
Hier eine Datumsumwandlung
// Text bzw. String, der durchsucht werden soll
$TXT = "20080505";
// Das Suchmuster mit Delimiter und Modifer (falls vorhanden)
$pattern = '$([0-9]{4})([0-9]{2})([0-9]{2})$';
// Ersatzstring
$ersatz = '$3.$2.$1';
// RegEx mit preg_replace() auswerten
echo preg_replace($pattern, $ersatz, $TXT );
// Ausgabe 05.05.2008
Linkumwandlung für den Indianer
Der Apache unterstützt eine automatische Linkwandlung. Das Modul dafür heißt ModRewrite. Es wird häufig auch in Verbindung mit Typo3 eingesetzt. Das Ganze funktioniert so:
In der .htaccess Datei des entsprechenden Webbereiches wird der nachfolgende Eintrag gemacht:
#Einschalten des Moduls
RewriteEngine on
#Rewrite Regeln
RewriteRule ^ausgabeseite_([0-9]+).*.html$ /showcontent.php?ID=$1
Was passiert nun?
- Auf dem Webserver schlägt die Anfrage "ausgabeseite_2523_Suchbegriff_Wieder-Suchbegriff_SEO_Googleoptimiert_wieder_ein_Wort.html" auf.
- ModRewrite läßt nun den regulären Ausdruck darüberlaufen.
- Vor der Zahl steht "ausgabeseite_", danach kommt eine beliebige Zeichenfolge .* und ".html".
- Da die Entsprechung der Zahl im regulären Ausdruck geklammert ist, wird die Zahl 2523 in die Variable $1(1. Klammer) geladen.
- Der reguläre Ausdruck ist also "true", die Regel kann greifen und das Modul ruft die Seite "/showcontent.php?ID=2523" auf. Die Variable $1 beinhaltet ja die Zahl 2523.
Auf diese Weise können ganz einfach beliebige Suchbegriffe in die URL eingeschleust werden. Zugleich wird hier eine statische Seite vorgetäuscht, was wiederum noch einmal eine höhere Suchmaschineneinstufung begünstigt.
Links
Seite zum schnellen Testen von regulären Ausdrücken: www.regex-tester.de
Aktualisiert (Mittwoch, den 11. Januar 2012 um 19:11 Uhr)