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!


veröffentlicht am 18.10.2016 von Bernhard
geändert am 23.11.2021 von Bernhard


Top-Artikel in diesem Bereich

PHP Befehle: Funktionen auf einen Blick

geändert: 23.04.2021 von Bernhard (Erstveröffentlichung: 17.10.2016)

Die verfügbaren PHP-Funktionen (Befehle) können mit der PHP-Funktion get_defined_functions(); aufgelistet werden. ... weiterlesen

PHP UTF-8 Umlaute

erstellt: 06.05.2020 von Bernhard

Bei Problemen mit den Umlauten in PHP, liegt das meist an einer falschen Zeichenkodierung. ... weiterlesen

Preview php Datei erstellen - was ist PHP - Grundlagen

php Datei erstellen - was ist PHP - Grundlagen

geändert: 08.06.2021 von Bernhard (Erstveröffentlichung: 22.08.2012)

PHP ist eine serverseite Scriptsprache für Webseiten. Sie ermöglicht es, im Gegensatz zu statischen html Seiten, Inhalte auf dem Server zu verändern oder zu speichern. Beispiele hiefür sind ein Gästebuch,  Forum, Kommentarfunktion oder das online Bearbeiten und Speichern von Daten von Webseiten. Der PHP Code wird dazu direkt vom Server ausgeführt, d.h. im Quelltext des Browsers kann man nicht sehen, was eigentlich hinter der Seite steckt. Der Browser bekommt immer einen fertigen HTML Code gelief... ... weiterlesen


Fragen / Kommentare


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

✍anonym
erstellt am 22.04.2019 13:04
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.