Für Menschen · Seien Sie begeistert und Sie werden begeistern !

Die Nutzung von Regular Expressions, reguläre Ausdrucke, sind nicht leicht verständlich und doch in der Entwicklung notwendig und nützlich. Mir persönlich liegen die abstraketen Formulierungen nicht sonderlich und so habe ich immer diverse Schnipsel der Regex gesammelt.
Einige davon lege ich nun online ab, weil ich denke, dass sie recht nützlich sind und eine einfache Nutzung ermöglichen.
Zusätzlich habe ich einige Links gelistet, die in diesem Umfeld sehr nützlich sein können, besonders gefällt mir das Desktop-Tool für Windows RegexMagic.
Zum Einstieg einige Grundregeln, bevor es in die Beispiele geht. Gern können zusätzliche Schnipsel oder Korrekturen, Verbesserungen in den Kommentaren hinterlegt werden.
| Regular Expression | Bedeutung |
|---|---|
foo |
Der String "foo" |
^foo |
"foo" Am Anfang des String |
foo$ |
"foo" Am Ende des String |
^foo$ |
"foo" Alleinstehender String |
[abc] |
a, b, oder c; irgendein String der Liste |
[a-z] |
Irgendein kleingeschriebender Buchstabe |
[^A-Z] |
Irgendein Zeichen, welches kein Großbuchstabe ist |
(gif|jpg) |
Erkenne "gif" oder "jpeg" |
[a-z]+ |
Ein oder mehrere kleingeschriebene Buchstaben |
[0-9.-] |
Eine Zahl, ein Punkt oder ein Minus |
^[a-zA-Z0-9_]{1,}$ |
Irgendein Wort, von mindestens einem Buchstaben, einer Zahl oder Underline _ |
([fb])([wp]) |
fw, fp, bw oder bp |
[^A-Za-z0-9] |
Ein Symbol (keine zahl oder Buchstabe) |
([A-Z]{3}|[0-9]{4}) |
Erkenne drei Buchstaben oder vier Zahlen |
| Funktion | Bedeutung |
|---|---|
preg_grep() |
Liefert Array-Elemente, die auf ein Suchmuster passen |
preg_match_all() |
Führt eine umfassende Suche nach Übereinstimmungen mit regulärem Ausdruck durch |
preg_match() |
Führt eine Suche mit einem regulären Ausdruck durch |
preg_quote() |
Maskiert Zeichen regulärer Ausdrücke |
preg_replace_callback() |
Sucht und ersetzt einen regulären Ausdruck unter Verwendung eines Callbacks |
preg_replace |
Sucht und ersetzt einen regulären Ausdruck |
preg_split() |
Zerlegt eine Zeichenkette anhand eines regulären Ausdrucks |
preg_filter() |
Suchen und ersetzen mit einem regulären Ausdruck; ab PHP 5.3.0 |
$email = "test@example.com";
if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/', $email)) {
echo 'Die E-Mail ist OK.';
} else {
echo 'Falsches E-Mail-Format';
}
Besser geht es ab PHP 5.2.0 mit der Funktion filter_var(), wobei man spezifische Filter angeben kann.
if ( filter_var('test+email@example.com', FILTER_VALIDATE_EMAIL) ) {
echo 'Die E-Mail ist OK.';
} else {
echo 'Falsches E-Mail-Format';
}
$username = 'example_user_name_123';
if ( preg_match('/^[a-z\d_]{5,20}$/i', $username) ) {
echo 'Username ist OK.';
} else {
echo 'Username-Format ist nicht OK.';
}
$phone = '(021)423-2323'; // US Format
if ( preg_match('/\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x', $phone) ) {
echo 'Telefonnummer ist OK.';
} else {
echo 'Telefonnummer ist nicht OK.';
}
$phone = '+49 (00000) 00000'; // DE Format
if ( eregi("^[ +0-9/()]+$", $phone) ) {
echo 'Telefonnummer ist OK.';
} else {
echo 'Telefonnummer ist nicht OK.';
}
$phone = '+49 (00000) 00000'; // DE Format
if ( preg_match('#[^0-9\+\-\040/]#', $phone) ) {
echo 'Telefonnummer ist nicht OK.';
} else {
echo 'Telefonnummer ist OK.';
}
$IP = '198.168.1.78';
if ( preg_match('/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/', $IP) ) {
echo 'IP ist OK';
} else {
echo 'IP ist nicht OK';
}
$zipcode = '12345-5434'; // US Code
if ( preg_match("/^([0-9]{5})(-[0-9]{4})?$/i", $zipcode) ) {
echo 'PLZ ist OK';
} else {
echo 'PLZ ist nicht OK';
}
$zipcode = '99817'; // DE Code
if ( preg_match('/[0-9]{5}$/', $zipcode) ) {
echo 'PLZ ist OK';
} else {
echo 'PLZ ist nicht OK';
}
$ccnr = "378282246310005";
if ( preg_match('/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})$/', $ccnr) ) {
echo 'Nummer ist OK';
} else {
echo 'Nummer ist nicht OK';
}
$url = "http://example.com/";
if (preg_match('/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i', $url)) {
echo 'Deine URL ist OK.';
} else {
echo 'Falsche URL.';
}
$url = "http://example.com/index.htm";
preg_match( '@^(?:http://)?([^/]+)@i', $url, $matches );
$host = $matches[1];
echo $host;
$text = "Ein Bespieltext für reguläre Ausdrücke, kurz regex. Um regex zu lernen, muss man sich oft regexen und higlighten geht auch in Pluralformen wie regexs oder dem regexen.";
$text = preg_replace( "/\b(regex)\b/i", '<span style="background: yellow">\1</span>', $text );
echo $text;
$images = array();
preg_match_all('/(img|src)=("|')[^"'>]+/i', $data, $media);
unset($data);
$data = preg_replace( '/(img|src)("|'|="|=')(.*)/i', "$3", $media[0] );
foreach($data as $url) {
$info = pathinfo($url);
if ( isset( $info['extension'] ) ) {
if (
($info['extension'] == 'jpg') ||
($info['extension'] == 'jpeg') ||
($info['extension'] == 'gif') ||
($info['extension'] == 'png')
)
array_push($images, $url);
}
}
$text = preg_replace("/s(w+s)1/i", "$1", $text);
$text = preg_replace("/\.+/i", ".", $text);
function get_tag( $tag, $xml ) {
$tag = preg_quote($tag);
preg_match_all( '{<' . $tag . '[^>]*>(.*?)</' . $tag . '>.}',
$xml,
$matches,
PREG_PATTERN_ORDER
);
return $matches[1];
}
$fp = fopen("http://www.example.com/", "r");
$page = '';
while ( !feof($fp) ) {
$page .= fgets($fp, 4096);
}
$title = eregi("<title>(.*)</title>", $page, $regs);
echo $regs[1];
fclose($fp);
$content = preg_replace("~@(\w+)~", "<a href=\"http://twitter.com/\\1\" class=\"twitter-user\">@\\1</a>", $content);
$content = preg_replace("~^(\w+):~", "<a href=\"http://twitter.com/\\1\" class=\"twitter-user\">@\\1</a>);
$content = preg_replace("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t< ]*)#", "\\1<a href=\"\\2\">\\2</a>", $content);
$content = preg_replace("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r< ]*)#", "\\1<a href=\"http://\\2\">\\2</a>", $content);
$content = preg_replace("/#(\w+)/", "<a href=\"http://search.twitter.com/search?q=\\1\">#\\1</a>", $content);
händischer Spam:
Beachte die Kommentarregeln, jede Form von versuchtem Spam wird gelöscht. Warum und wieso steht in einem meiner Beiträge.
Bezug auf Textstellen:
Du kannst direkt bezug auf Textstellen im Beitrag nehmen. Dazu muss lediglich der Bereich im Artikel markiert werden; daraufhin erscheint ein Button, der den markierten Text in das Kommentarfeld übernimmt und als Zitat auszeichnet. Die Funktion ist nur bei aktivem JavaScript nutzbar.
xHTML:
Du kannst folgende Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <blockquote cite=""> <code> <pre> <em> <strong> <strike> <ul> <ul> <li>
Achte darauf, wenn du Code im Kommentar hinterlegen willst, dann muss der Code maskiert sein. Dann wird er nicht interpretiert. Der Code muss mit Hilfe von HTML-Entities dargestellt werden, d.h. dass man z.B. < als < und > als > einfügt.
E-Mail-Benachrichtigung bei neuen Kommentaren ?
Wenn der Haken in der Checkbox gesetzt ist, dann wirst du über neue Kommentare vie E-Mail informiert. Der Versand erfolgt nur, wenn du die URL in der Bestätigungs-E-Mail genutzt hast oder schon Abonnent hier im Blog bist.
Kommentar erscheint nicht:
Alle Kommentare werden manuell geprüft, freigegeben und nach Möglichkeit beantwortet. Bitte um etwas Geduld und Nachsicht.
Identifikationsbilder (Avatare):
Auf Gravatar.com kann man sich mit seiner E-Mail-Adresse registrieren und ein Bild hochladen, dann erscheint dieses Gravatar hier und in vielen weiteren Blogs.
Spamschutz:
Das Kommentarformular ist mit einem Spamschutz ausgerüstet. Solltest du diesen Artikel ohne JavaScript besuchen und kommentieren wollen, so muss du die Frage beantworten und das jeweilige Wort in das Textfeld eingeben.
bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.
Das Weblog wird angetrieben von WordPress und aktuell gibt es 971 Beiträge, 19439 Kommentare in 14 Kategorien und 459 Tags.
Das Blog wird liebevoll mit xHTML & CSS in Handarbeit gestaltet. Erstellt mit ♥ zum Befüllen und Erhalten.
Design und Code ist unter Copyright
© 2001 - 2012 bueltge.de [by:ltge.de]
7. August 2009 um 15:01
Schöne Schnipsel, was hab ich mich schon mit dem Zeug geärgert.
7. August 2009 um 15:21
Ein sehr nützliches Tool ist in meinen Augen der RegEx-Tester.
7. August 2009 um 21:10
Den Schnipsel Nummer 13 hatte ich vor kurzem schonmal gelesen und probiert, jedoch ist da irgenwie der Wurm drin, wenn ich ihn so kopiere und einfüge, bekomme ich einen Fatal Error mit der Meldung syntax error, unexpected '}' . In dem Fall dritte Zeile.
Gruß
7. August 2009 um 23:30
Danke für den Hinweis, habe es korrigiert.
8. August 2009 um 15:53
email-adressen dürfen auch "+"-zeichen enthalten. beliebter fehler bei abfragen von gültigkeit von adressen. dabei sind plus-zeichen so praktisch. s.a.
http://css.psu.edu/news/emailplus.html8. August 2009 um 20:33
Statt Tipp 8 wäre doch "parse_url" praktischer, oder?
http://www.php.net/manual/en/function.parse-url.php8. August 2009 um 21:41
Hallo Frank,
erst mal Danke für den Artikel. Ist wirklich ein schöne, kompakte Übersicht über Regex.
Nur ein Kleinigkeit sollte man vielleicht doch noch erwähnen.
Regex um einen Integer zu validieren ( Siehe Postleitzahl ) ist unnötig. Als Beispiel macht das jetzt hier zwar Sinn, aber in der Praxis sollte man zum validieren eines simplen Integer doch eher ctype_digit verwenden.
Und wenn man mit XML arbeiten möchte, sind DOM und XPATH eher das was man verwenden sollte.
Kore Nordmann erklärt hier auch sehr gut warum man das nicht machen sollte.
Ansonsten guter Artikeln.
Beste Grüße
Dominik
9. August 2009 um 12:21
Ich vermisse sowas ganz einfaches. Wie kann ich mit mod_rewrite unter Hilfe von RegEx alle Link Anfragen bei einer Domain auf eine bestimmte Seite umleiten.
Sprich:
http://www.domain.de/pizza.htmlsoll dann genauso aufhttp://www.domain.de/bla.htmlumgeleitet werden, wie jede andere Anfrage anstell von pizza.html9. August 2009 um 19:11
@Christian
Na ja, das hat ja erst mal nichts mit PHP Regex zu tun.
Aber wenn du das brauchst schau mal hier:
http://www.modrewrite.de/9. August 2009 um 22:12
Dachte eher an eine Syntax, die alles an spricht. Ich weiß nicht, irgendwie ein * oder sowas gab es da doch mal in der RegEx, oder?
10. August 2009 um 11:55
Sehr guter Artikel für Anfänger
Verstehe nur nicht warum der Link zur Regular Expression Library (
http://regexlib.com/) nicht auftaucht. Hier findet man eine Riesen Datenbank mit Regular Expressions10. August 2009 um 12:29
Wurde ergänzt, danke für den Hinweis.
19. September 2009 um 11:35
Geniale Snippets! Vielen Dank! So sind die Ausdrücke mal ein wenig verständlicher geworden für mich.
2. Januar 2010 um 17:03
Echt guter Beitrag, muss ich mal so sagen. Da hast Du dir echt viel Mühe gegeben. Es währe aber noch sinvoll auf \s \w \d und so weiter einzugehen.
5. Januar 2010 um 00:04
Gutes Tutorial, aber das RegEx Emailadresse prüfen geht so nicht.
Alle Adressen mit ä,ö und ü bleiben außen vor. FILTER_VALIDATE_EMAIL kennt auch keine Umlaute, aber z.B.
barbel@example.museumist ok. Das RegEx kennt auch keine Umlaute und kann mit "museum" auch nichts anfangen. Ist aber gültig.bärbel@example.museum kann keiner leiden.
Gruß aus Sachsen-Anhalt
17. Februar 2010 um 15:00
danke für den beitrag!
20. August 2010 um 10:23
Damti ersetzt man alle Zeichen in $text durch einen Punkt. Hat der Code-Beautifier den Backslash gefressen?
ersetzt mehrere Punkte in Folge gegen jeweilis genau einen.
25. August 2010 um 16:15
@Marc: danke für den Hinweis, war ein Fehler im Beitrag, den ich nun korrigiert habe.
12. Mai 2011 um 15:20
Hallo Jungs, will seit ein Paar Tagen einen Reg Expression für das folgende Problem finden: Ich muss in einem Text den String 6.4.0 suchen, aber will nicht die Strings haben, die 6.4.0 enthalten. Z.B. in meine Ergebnismenge 6.4.0.4.5 oder 2.6.4.0 sollen nicht vorkommen. Wie kann man das mit Hilfe von Reg Expressions machen bzw. geht das überhaupt?
6. Oktober 2011 um 14:13
Für das prüfen einer Domain könnte man auch, wie bei der E-Mail-Adresse ebenfalls die Funktion filter_var($url, FILTER_VALIDATE_URL) benutzen.
9. November 2011 um 16:26
Leider ist die Email-Validierung nicht ganz korrekt. Adressen bei der Domain "t-online.de" wird als falsches Email-Format bezeichnet.
Ansonsten echt klasse gemacht, danke!