(0)
Artikel
bewerten
(100% positiv)
(1)

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.

preg_match

Die Funktion preg_match wird verwendet, um aus einem String einen bestimmten Wert auszulesen. 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];
?>

Ausgabe:

Headline

mögliche Suchpattern

PHP verwendet für die Suchfunktionen PCRE (Perl Compatible Regular Expressions).

In regulären Ausdrücken entsprechen die meisten Zeichen nur sich selbst. Als Beispiel führt das Suchen im String "ich lerne PHP", mit dem Suchbegriff "lerne", zu einem Treffer.

Zudem haben einige Zeichen eine spezielle Bedeutung (Metazeichen): 

^ sucht zu Beginn des Strings und

$ am Ende des Strings.

. bedeutet ein alphanumerisches Zeichen.

| wird für oder verwendet.

Die zu suchenden Zeichen können in einer Zeichenklasse zusammengefasst werden.  Zum Beispiel entspricht eine Zeichenklasse [abc]: a, b oder c. [a-z] entspricht a,b,c,d, ... z. Zeichenklassen können mit ^ negiert werden: [^abc] entspricht alles außer a,b,c.

Sollten Metazeichen als normale Zeichen verwendet werden, müssen diese mit \ escaped werden \$, \., \| 

+, *, ? und {} beeinflusst wie oft ein Muster entsprechen soll.

+ bedeutet eines oder mehrere der vorherigen Ausdrücke

* bedeutet keines oder mehrere der vorherigen Ausdrücke (.* bedeutet also keines oder mehrere alphanumerische Zeichen. )

? keines oder eines der vorherigen Ausdrücke

{3} genau 3 Vorkommen der vorherigen Ausdrücke

{3,} 3 oder mehrere Vorkommen der vorherigen Ausdrücke

{a,b} entspricht dem vorherigen Zeichen wenn es a-mal vor kommt, aber nicht öfter als b-mal.

Zeichen können zusätzlich gruppiert werden: h(a|e)llo entspricht hallo oder hello

 

Hier einige Beispiele:

Ausdruck Treffer
text text
^text "text" zu Beginn eines Strings
text$ "text" am Ende eines Strings
^text$ "text" wenn alleine in einem String
[abc] a, b, oder c
[a-z] a, b, c, d, e - z ... alle Kleinbuchstaben
[^A-Z] alle nicht Großbuchstaben.
(eins|zwei) eins oder zwei
[a-z]+ ein oder mehrere Kleinbuchstaben
[a-z]* kein oder mehrere Kleinbuchstaben
[0-9\.\-] 0,1,2,3,4,5,6,7,8,9,.,- Nummer, Punkt oder Minus
^[a-zA-Z0-9_]{1,}$ Ein Wort mit mindestens einem Buchstaben, Zahl oder Unterstrich
([ab])([cd]) ac, ad, bc, oder bd
[^A-Za-z0-9] Symbole die kein Buchstabe oder keine Zahl sind
([A-Z]{3}|[0-9]{4}) 3 Großbuchstaben oder 4 Zahlen

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="@<h1>(.*)</h1>@";

Modifier

Am Ende des Patterns kann noch ein Modifikator (Modifier) mitgegeben werden, beispielsweise um Zeilenumbrüche zu verarbeiten:

Parameter:

s$suchpattern="/<h1>(.*)</h1>/s";  Mit dieser Option werden mit dem Punkt auch Zeilenumbrüche erkannt. 

i: ignoriert Groß- und Kleinschreibung

siehe auch: http://regexp-evaluator.de/tutorial/modifier/#ungreedy 

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

Das Array $match enthält folgende Werte:

match[0]:<h1>Headline1</h1><p>Text</p><h1>Headline2</h1>
match[1]:Headline1
match[2]:Text
match[3]:Headline2

Wenn ein Suchtreffer in einer Zeile mehrfach vorkommen würde, umfasst der Treffer alles innerhalb dem ersten <h1> und dem letzten </h1>

folgender Quellcode:

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

erzeugt das Array $match mit folgenden Werten:

match[0]:<h1>Headline1</h1><p>Text</p><h1>Headline2</h1>
match[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);
?>

das Ergebnis wird innerhalb der ersten Zeile gesucht:

 [0] => <h1>Headline1</h1>
[1] => Headline1

Der zuvor erwähnte Parameter: "s" verarbeitet auch Zeilenumbrüche:

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

Ausgabe:

[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 nicht nur das Erste, sondern 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);
?>

Ausgabe:

Array
(
[0] => Array
(
[0] => <h1>Headline1</h1>
[1] => <h1>Headline2</h1>
)

[1] => Array
(
[0] => Headline1
[1] => Headline2
)

)

 

 

letzte Änderung dieses Artikels: 18.10.2016 07:25




Kommentare