Hauptmenü

Untermenü

PHP/MySQL - Reguläre Ausdrücke - Rückbezüge

1. Die Abschnitte

2. Neudeutsch

... auch Backreferences genannt, beziehen sich auf vorherige Suchmuster, die man eingeklammert hat. So befindet sich dann deren Inhalt in einer Art durchnummerierten Variable. Nehmen wir mal ein erweitertes Beispiel aus dem vorletzten Abschnitt:


<?php
  $result '<a href="bla.htm">bla</a>';
  preg_match_all ("|<(a)[^>]*>(.+\w)</(a)>|i",$result$links);
?>

Ist zugegebenermaßen ziemlich sinnfrei, aber hier geht es erst mal ums Prinzip. Also wir haben drei(!) Klammerungen gesetzt und bekommen dementsprechend ein Array mit vier Einträgen, wobei die Werte 1 bis 3 unsere Referenzen sind.


[0] => <a href="bla.htm">blubb</a>
[1] => a
[2] => bla
[3] => a

3. Anwendungsmöglichkeiten

In obigem Beispiel suchen wir ja nur nach Link-Elementen. Aber was, wenn wir nach verschiedenen HTML-Tags suchen? Da könnte das schon ziemlich ausarten. Will man zum Beispiel nach veralteten physikalischen Auszeichnungen suchen, so reicht das hier völlig aus.


<?php
  $string '<b>Ganz wichtig</b>
             <u>unterstrichen</u>
             <i>und schräg</i>';
  preg_match_all ('/<(b|u|i)>(.*)<\/(\1)>/i'$string$hitPREG_SET_ORDER);
?>

Erläuterung

Die 1 repräsentiert in diesem Fall das Ergebnis der ersten Klammerung, also entweder b, u oder i. So werden nur Textblöcke wie <b>...</b>, <u>...</u> oder <i>...</i> gefunden.

Wichtig

Den Rückbezug muss man unbedingt escapen, also mit einem \ versehen. Wenn man anstelle von einfachen Hochkommata mit Anführungszeichen arbeitet, benötigt man sogar zwei Backslashes, also "/<(b|u|i)>(.*)<\/(\\1)>/i".

Will man zum Beispiel aus uraltem Quellcode alle HTML-Tags herausfiltern, die man anno dunnemals noch groß geschrieben hat, so ginge das damit.


<?php
  $string '<A name="bla">bla</A> oder <P>blubb</P> 
            oder <A name="laber">laber</A><H1>sülz</H1>
            <B class="superfett">und noch etliches weitere</B>';
  preg_match_all ('/<([A-Z0-9]{1,})[^>]*>(.*)<\/(\1)>/'$string$hitPREG_SET_ORDER);
  print_r($hit);
?>

4. Unterdrückung

Wenn man aus irgend einem Grund bei einem geklammerten Ausdruck keine Rückbezüge erzeugen möchte, so kann man das Suchmuster erweitern mit ?:. Damit wird hier zum Beispiel durch (?:.*) der Text zwischen den Tags nicht zurückgegeben.


<?php
  $string '<b>Ganz wichtig</b>
             <u>unterstrichen</u>
             <i>und schräg</i>';
  preg_match_all ('/<(b|u|i)>(?:.*)<\/(\1)>/i'$string$hitPREG_SET_ORDER);
  print_r($hit);
?>

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