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

 

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Aktualisiert: 23.11.2021 von Bernhard |🔔 | Kommentare:1

PHP Array und Schleifen | PHP | PHP Textdateien

Fragen / Kommentare


(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]

✍anonym
22.04.2019 13:50
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.