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);
    
    

Nützliche Links & Tools

16 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!

Überlastung, Kommentare sind vorübergehend geschlossen

Ich bin urlaubsreif, ersticke in Arbeit und damit auch für die Leser des Weblogs nicht zu erreichen. Bitte geduldet euch ein wenig mit Supportanfragen.
Leider muss ich die Kommentarfunktion deaktivieren, ansonsten würde ich weiter in Arbeit ersticken oder die Anfragen nicht nach bestem Gewissen beantworten.

Vielen Dank für das Verständnis!