PHP reguläre Ausdrücke Regex: preg_match, preg_match_all
Mit regulären Ausdrücken kann ein Text untersucht oder modifiziert werden. Reguläre Ausdrücke ermöglichen das Suchen nach Mustern innerhalb einer Zeichenkette und können Übereinstimmungen extrahieren oder ersetzen. PHP verwendet, wie auch andere aktuelle Skriptsprachen, für die Suchfunktionen PCRE (Perl Compatible Regular Expressions) oder kurz Regex bzw. RegExp. Regex kann in den meisten Skriptsprachen nahezu gleich verwendet werden, daher habe ich die Grundbegriffe und Funktionsweise inklusive Beispiele in einem gesonderten Beitrag zusammengefasst, siehe Regex - Überblick. Dieser Beitrag konzentriert sich auf konkrete Beispiele inklusive PHP-Quellcode.
Begrenzer
Der Suchpattern wird mit zwei Begrenzern eingeschlossen, meist wird dazu ein /
verwendet. Jeder Suchpattern startet also mit /
und endet mit /
; innerhalb der Begrenzer befindet sich der eigentliche Pattern.
Anstelle von / könnte auch @
verwendet werden: $suchpattern="@Suchpattern@";
Modifier
Am Ende des Patterns kann noch ein Modifikator (Modifier) mitgegeben werden, beispielsweise um Zeilenumbrüche zu verarbeiten:
Parameter | Beschreibung |
s | Mit dieser Option werden mit dem Punkt auch Zeilenumbrüche erkannt. Beispiel: $suchpattern="/<h1>(.*)</h1>/s"; |
i | ignoriert Groß- und Kleinschreibung. |
preg_match
Die Funktion preg_match wird verwendet, um aus einem String einen bestimmten Teil zu extrahieren. Für ein besseres Verständnis starte ich gleich mit einem Beispiel:
Um aus folgendem HTML-Quellcode die Überschrift zu extrahieren: <html><head></head><body><h1>Headline</h1></body></html>
, kann preg_match wie folgt verwendet werden:
<?php
$string="<html><head></head><body><h1>Headline</h1></body></html>";
$suchpattern="@<h1>(.*)</h1>@";
preg_match($suchpattern, $string, $match); //Search-String
echo $match[1];
?>
Result:
Headline
mehrere Treffer
<?php
$string="<html><head></head><body><h1>Headline1</h1><p>Text</p><h1>Headline2</h1></body></html>";
$suchpattern="@<h1>(.*)</h1><p>(.*)</p><h1>(.*)</h1>@";
preg_match ($suchpattern, $string, $match); //Search-String
print_r($match);
?>
Result:
Array
(
[0] => <h1>Headline1</h1><p>Text</p><h1>Headline2</h1>
[1] => Headline1
[2] => Text
[3] => Headline2
)
Wenn ein Suchtreffer in einer Zeile mehrfach vorkommen würde, umfasst der Treffer alles innerhalb dem ersten <h1>
und dem letzten </h1>
<?php
$string="<html><head></head><body><h1>Headline1</h1><p>Text</p><h1>Headline2</h1></body></html>";
$suchpattern="@<h1>(.*)</h1>@";
preg_match ($suchpattern, $string, $match); //Search-String
print_r($match);
?>
Result:
Array
(
[0] => <h1>Headline1</h1><p>Text</p><h1>Headline2</h1>
[1] => Headline1</h1><p>Text</p><h1>Headline2
)
anders sieht das Ergebnis aus, wenn Zeilenumbrüche im Spiel sind
Zeilenumbrüche
<?php
$string="<html><head></head><body>
<h1>Headline1</h1>
<p>Text</p>
<h1>Headline2</h1>
</body></html>";
$suchpattern="@<h1>(.*)</h1>@";
preg_match ($suchpattern, $string, $match); //Search-String
print_r($match);
?>
Result:
Array
(
[0] => <h1>Headline1</h1>
[1] => Headline1
)
Der zuvor erwähnte Parameter: "s" verarbeitet auch Zeilenumbrüche:
<?php
$string="<html><head></head><body>
<h1>Headline1</h1>
<p>Text</p>
<h1>Headline2</h1>
</body></html>";
$suchpattern="@<h1>(.*)</h1>@s";
preg_match ($suchpattern, $string, $match); //Search-String
print_r($match);
?>
Result:
Array
(
[0] => <h1>Headline1</h1>
<p>Text</p>
<h1>Headline2</h1>
[1] => Headline1</h1>
<p>Text</p>
<h1>Headline2
)
preg_match_all
Die Funktion preg_match_all verwendet dieselben Parameter wie preg_match. Im Gegensatz zu preg_match, liefert preg_match_all alle Vorkommen der Suche in einem mehrdimensionalen Array.
<?php
$string="<html><head></head><body>
<h1>Headline1</h1><p>Text</p>
<h1>Headline2</h1>
</body></html>";
$suchpattern="@<h1>(.*)</h1>@";
preg_match_all ($suchpattern, $string, $match); //Search-String
print_r($match);
?>
Result:
Array
(
[0] => Array
(
[0] => <h1>Headline1</h1>
[1] => <h1>Headline2</h1>
)
[1] => Array
(
[0] => Headline1
[1] => Headline2
)
)
Grundlagen und zusätzliche Beispiele zu Regex, siehe: Regex - Überblick - Begriffe - Parameter - Theorie - Grundlagen
{{percentage}} % positiv
DANKE für deine Bewertung!
Fragen / Kommentare
(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]
User: Alexander Hallo, Dank der obigen Anleitung funktioniert bei mir das Auslesen fast. Von einer Zeile mit dem Inhalt kann ich fehlerfrei den Wert auslesen mit: $pattern="/value="(.*)" maxlength=/"; if (preg_match ($pattern, $row, $matches)) { $value = $matches[1]; } Wenn die Zeile aber Uhrzeit und Datum als Wert enthält, dann erhalte ich mit dem obigen Pattern einen Fehler. Wahrscheinlich werden der Doppelpunkt und das Slash-Zeichen nicht erkannt. Wie muss ich den obigen Pattern-Ausdruck ändern, damit nicht nur Zahlen und Buchstaben, sondern auch der Wert mit dem Datum gelesen wird (kein Prüfen von Datum)? Danke.