PHP/MySQL - Reguläre Ausdrücke - Klammern
1. Die Abschnitte
- Einführung
- Befehle
- Grundlagen Teil 1
- Grundlagen Teil 2
- Der Backslash (\)
- Klammern
- Gierig und ungierig
- Rückbezüge
- Beispiele
2. Wichtig!
Da es hier um prinzipielle Dinge geht, benutze ich aus Faulheit sehr häufig das \w
. Sichtwort Perl-"word".
Das greift aber nur bei einem Wort. Sollte also in den folgenden Beispielen der Linktext aus mehreren Wörtern besteht.
so greift das Pattern nicht. Also Obacht!
3. Auflistung
Bei einem normalen regulären Ausdruck bekommt man das Ergebnis komplett als Zeichenkette zurück. Nehmen wir mal an, wir wollen aus einem String alle Links extrahieren. Der Ausdruck dafür sieht zum Beispiel so aus.
<?php
$result = 'Text mit diversen Links wie
<a href="bla.htm">bla</a> oder
<a href="blubb.htm">blubb</a>
und noch etliche weitere';
preg_match_all ("|<a[^>]*>.+\w</a>|i",$result, $links);
print_r($links);
?>
Und das Ergebnis so.
Array
(
[0] => Array
(
[0] => <a href="bla.htm">bla</a>
[1] => <a href="blubb.htm">blubb</a>
)
)
4. Aufdrösel
Sehr oft möchte man aber das Ergebnis auch noch in seine Einzelteile zerlegen, um dann mit denen weiter zu arbeiten.
Und um das zu erreichen, setzt man Klammern ein. Nehmen wir mal, dass wir den Text der Links separat erfassen wollen.
In diesem Fall setzt man den entsprechenden Bereich in eine Klammer ((.+\w)
), also so.
<?php
preg_match_all ("|<a[^>]*>(.+\w)</a>|i",$result, $links);
?>
In diesem Fall bekommen wir als Ergebnis ein mehrdimensionales Array zurück, in dessen ersten Teil die kompletten Links und im zweiten nur der Text dazwischen aufgelistet sind.
Array
(
[0] => Array
(
[0] => <a href="bla.htm">bla</a>
[1] => <a href="blubb.htm">blubb</a>
)
[1] => Array
(
[0] => bla
[1] => blubb
)
)
5. ... und Sortier
Wenn man das Ganze aber entsprechend der Links sortiert haben möchte, so kann man als zusätzlichen Parameter noch das Flag
PREG_SET_ORDER
angeben.
<?php
preg_match_all ("|<a[^>]*>(.+\w)</a>|i",
$result, $links, PREG_SET_ORDER);
?>
Denn dann bekommt man dieses Ergebnis.
Array
(
[0] => Array
(
[0] => <a href="bla.htm">bla</a>
[1] => bla
)
[1] => Array
(
[0] => <a href="blubb.htm">blubb</a>
[1] => blubb
)
6. Das Schema
Egal ob ihr nun mit PREG_SET_ORDER
oder ohne arbeitet, das grundsätzliche Schema gliedert sich wie folgt.
- Erst die Auflistung des gesamten(!) gefundene Ausdrucks.
- Dann die einzelnen geklammerten "Zwischenergebnisse" als zusätzliche Elemente.
Um das Prinzip zu verstehen, lasst mal folgenden Ausdruck auf eine Linksammlung los, dann werdet ihr es schon begreifen.
<?php
preg_match_all ("|(<a[^>]*>)(.+\w)(</a>)|i",
$result, $links, PREG_SET_ORDER);
?>
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt