====== Reguläre Ausdrücke ====== ===== Beispiel 1: preg_match ===== ==== Aufgabe ==== Aus dem Ergebnis des Aufrufs der JavaScript-Funktion "navigator.appVersion" im Browser Google Chrome soll die Versionsnummer herausfiltert werden. ==== PHP-Code ==== $appVersion = "5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"; if( preg_match( '/Chrome\/(?P[0-9.]{1,})/', $appVersion, $result ) ) { echo $result[2]; // Ergebnis: "57.0.2987.133" } ==== Erläuterung des regulären Ausdrucks ==== ///Chrome\/(?P[0-9.]{1,})/// ^Ausdruck^Bedeutung^ |/|Muster-Begrenzungszeichen am Anfang| |Chrome|Das Wort "Chrome"| |\/|das escapte "Slash"-Zeichen hinter dem Wort "Chrome"| |(|Beginn des Teilsuchmusters| |?P|Teilsuchmuster mit dem Namen "Version" benannt| |[0-9.]|Alle Ziffern von 0 bis 9 inklusive Punkt| |{1,}|die vorangestellten Zeichen müssen mindestens einmal und dürfen beliebig oft vorkommen| |)|Ende des Teilsuchmusters| |/|Muster-Begrenzungszeichen am Ende| //Erläuterung:// Die PHP-Funktion "preg_match" sucht nach der ersten Übereinstimmung und gibt im Erfolgsfall "true" zurück. Daher ist das Ergebnis nicht im Rückgabewert der Funktion, sondern im 3. Parameter ("$result") zu finden. Durch die Klammersetzung werden zwei Gruppen erstellt. Deshalb enthält das Ergebnis-Array drei Einträge: * $result[0] = gesamtes Suchmuster: "Chrome/57.0.2987.133" * $result[version] = abgegrenztes, benanntes Teilsuchmuster: "57.0.2987.133" * $result[1] = abgegrenztes, unbenanntes Teilsuchmuster: "57.0.2987.133" Somit können wir durch die Gruppierung unser gewünschtes Ergebnis in $result[version] finden. Wenn die Suche nach der ersten Übereinstimmung fortgesetzt werden soll, ist die Funktion "preg_match_all" (siehe Beispiel 2) zu verwenden. ---- ===== Beispiel 2: preg_match_all ===== ==== Aufgabe ==== Wir wollen aus dem unten stehenden Beispieltext alle Euro-Beträge, die durch das nachstehende Wort "Euro" oder mit dem Eurozeichen "€" gekennzeichnet sind, herausfiltern. ==== Beispieltext, der gefiltert werden soll ==== Die Bearbeitungsgebühr vom Lotto 6aus49 ist abhängig von der zuständigen Landeslotteriegesellschaft sowie von der Anzahl der teilnehmenden Wochen und bewegt sich zwischen 0,20 Euro und 1,50 Euro pro Spielschein. Im Bundesland Saarland ist die Teilnahme mit einer Bearbeitungsgebühr bis zu 1,50 Euro am teuersten. Somit kann ein komplett ausgefüllter Spielschein mit 5 Wochen Laufzeit für mittwochs und samstags inkl. Spiel 77, Super 6 und Glücksspirale maximal 184 Euro kosten. Für die Teilnahme an der Glücksspirale werden von einigen Landeslotteriegesellschaften noch eine zusätzliche Bearbeitungsgebühr zwischen 0,20 € bis 0,60 € berechnet. ==== PHP-Klasse ==== class TextFilter { private $content; public function loadFile( $filename ) { if( !file_exists( $filename ) ) return false; $this->content = file_get_contents( $filename ); return true; } public function getArray( $pattern ) { if( empty ( $pattern )) return false; preg_match_all( $pattern, $this->content, $result ); if( count( $result ) > 0 ) return $result[0]; } } ==== Aufruf der Methoden der PHP-Klasse ===== $filter = new TextFilter(); if( $filter->loadFile( "Beispieltext.txt" ) ) $result = $filter->getArray( '/\s\d{1,},?\d{0,2}\s(Euro|€)/' ); print_r( $result ); ==== Erläuterung des regulären Ausdrucks ==== ///\s\d{1,},?\d{0,2}\s(Euro|€)/// ^Ausdruck^Bedeutung^ |/|Muster-Begrenzungszeichen am Anfang| |\s|Leerzeichen| |\d|beliebige Ziffer zwischen 0-9| |{1,}|die vorangestellte Zahl muss mindestens einmal und darf beliebig oft vorkommen| |,|Komma (Trennzeichen zwischen Euro und Cent)| |?|Das vorangestellte Komma ist optional (darf, aber muss nicht vorkommen)| |\d|beliebige Ziffer zwischen 0-9| |{0,2}|die vorangestellte Ziffer muss gar nicht und darf max. zweimal vorkommen| |\s|Leerzeichen| |(Euro €)|Es muss das Wort "Euro" oder das "€"-Zeichen vorkommen| |/|Muster-Begrenzungszeichen am Ende| ---- ===== Beispiel 3: src aus Image-Tag extrahieren ===== if( preg_match( '/src=[\"\']([^\"\']+)/', $imgTag, $result ) ) { $src = $result[1]; } ---- ===== Weiterführende Links ===== * [[http://regexr.com/|Online Ausdrucks-Editor mit Echtzeitprüfung]] * [[https://danielfett.de/2006/03/20/regulaere-ausdruecke-tutorial/|Super Tutorial mit praktischen Beispielen!]] * [[http://webdesign.tepelmann.com/PHP_Beispiele_fuer_Regulaere_Ausdruecke.html#Jahreszahl|PHP-Beispiele für Reguläre Ausdrücke]]