Sidebar
ein-/ausblenden

PHP Regular Expression Schnipsel

Plugin für WordPress SEO

Anzeige

Buch Reguläre Asudrücke
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.

Diverse Regular Expression Syntax

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

PHP Funktionen

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
  1. E-Mail Adresse prüfen
    
    $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';
    }
    
  2. Usernamen prüfen
    
    $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.';
    }
    
  3. Telefonnummer prüfen
    
    $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.';
    }
    
  4. IP Addresse prüfen
    
    $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';
    }
    
  5. Postleitzahl prüfen
    
    $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';
    }
    
  6. Kreditkartenummer validieren
    
    $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';
    }
    
  7. Domains prüfen
    
    $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.';
    }
    
  8. Den Domainnamen einer URL ausgeben
    
    $url = "http://example.com/index.htm";
    preg_match( '@^(?:http://)?([^/]+)@i', $url, $matches );
    $host = $matches[1];
    
    echo $host;
    
  9. Hervorheben eines Wortes im Text
    
    $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;
    
  10. Bilder finden
    
    $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);
    	}
    }
    
  11. Wiederholende Wörter ersetzen
    $text = preg_replace("/s(w+s)1/i", "$1", $text);
  12. Wiederholende Punkte ersetzen
    $text = preg_replace("/\.+/i", ".", $text);
  13. xHTML/XML Tag finden
    
    function get_tag( $tag, $xml ) {
    	$tag = preg_quote($tag);
    	preg_match_all( '{<' . $tag . '[^>]*>(.*?)</' . $tag . '>.}',
    								$xml,
    								$matches,
    								PREG_PATTERN_ORDER
    								);
    
    	return $matches[1];
    }
    
  14. Seiten Titel finden
    
    $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);
    
  15. Twitter Process Name
    
    $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>);
    
  16. Twitter Tweet Links
    
    $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);
    
  17. Twitter Hashtag #
    
    $content = preg_replace("/#(\w+)/", "<a href=\"http://search.twitter.com/search?q=\\1\">#\\1</a>", $content);
    

Nützliche Links & Tools

21 Kommentare zu „PHP Regular Expression Schnipsel“

  1. 1
    Kommentar von Tom

    Schöne Schnipsel, was hab ich mich schon mit dem Zeug geärgert. ;)

  2. 2
    Kommentar von Benni

    Ein sehr nützliches Tool ist in meinen Augen der RegEx-Tester.

  3. 3
    Kommentar von ocean90

    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ß

  4. 4
    Kommentar von Frank Bültge

    Danke für den Hinweis, habe es korrigiert.

  5. 5
    Kommentar von igor

    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.html

  6. 6
    Kommentar von Paul

    Statt Tipp 8 wäre doch "parse_url" praktischer, oder?

    http://www.php.net/manual/en/function.parse-url.php

  7. 7
    Kommentar von Dominik Bonsch

    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

  8. 8
    Kommentar von Christian

    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.html soll dann genauso auf http://www.domain.de/bla.htmlumgeleitet werden, wie jede andere Anfrage anstell von pizza.html

  9. 9
    Kommentar von Dominik Bonsch

    @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/

  10. 10
    Kommentar von Christian

    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?

  11. 11
    Kommentar von Wesley Gibson

    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 Expressions

  12. 12
    Kommentar von Frank Bültge

    Wurde ergänzt, danke für den Hinweis.

  13. 13
    Kommentar von Aaron

    Geniale Snippets! Vielen Dank! So sind die Ausdrücke mal ein wenig verständlicher geworden für mich.

  14. 14
    Kommentar von Nico

    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.

  15. 15
    Kommentar von Dieter

    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. ist 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

  16. 16
    Kommentar von sally

    danke für den beitrag!

  17. 17
    Kommentar von Marc

    $text = preg_replace("/.+/i", ".", $text);

    Damti ersetzt man alle Zeichen in $text durch einen Punkt. Hat der Code-Beautifier den Backslash gefressen?

    $text = preg_replace("/\.+/i", ".", $text);

    ersetzt mehrere Punkte in Folge gegen jeweilis genau einen.

  18. 18
    Kommentar von Frank Bültge

    @Marc: danke für den Hinweis, war ein Fehler im Beitrag, den ich nun korrigiert habe.

  19. 19
    Kommentar von Ghostrider

    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?

  20. 20
    Kommentar von Eike

    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.

  21. 21
    Kommentar von Leranis

    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!

Kommentar schreiben

Kommentarregeln: Bleib cool, kritisch ist in Ordnung, aber wenn du unhöflich bist, dann lösche ich deinen Kommentar. Bitte benutze deinen persönlichen Namen oder Initialen und nicht den Namen eines Unternehmens, dies würde als Spam gewertet und wird gelöscht. Der Zusammenhang zwischen Namen und URL sollte nicht offensichtlich auf Spam hindeuten! ♥ Ansonsten, vielen Dank für den Kommentar und viel Spaß mit meinem Blog.

E-Mail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.

Kommentar-Hilfe

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 &lt; und > als &gt; 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.