Hauptmenü

Untermenü

PHP/MySQL - Reguläre Ausdrücke - Klammern

1. Die Abschnitte

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$linksPREG_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.

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

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt