Der Dicki: Erklärung zu einem regulären Ausdruck gesucht

Hallihallo!

Ich beschäftige mich gerade ziemlich intensiv mit PHP, und dabei bin ich nun bei der bedingten Ersetzung von Teilstrings gelandet.
Das eigentliche Problem bestand darin, bestimmte Schlüsselwörter durch Bilder zu ersetzen (kein Problem), jedoch nicht innerhalb von HTML-Tags (in meinem Fall Verweise, grosses Problem).

Die Lösung habe ich nach viel Suchen auch gefunden:
$string = preg_replace("/((<[^>]*)|$s)/ie", '"$2"=="$1"? "$1":"$t"', $string);
ersetzt ausserhalb von spitzen Klammern alle $s durch $t.
Tolle Sache.
Aber ich würde gerne verstehen, wie genau dieser Ausdruck das macht.
Besonders interessante Frage vor Allem: welche Rückbeziehung sitzt jetzt in $1, und welche in $2? Da habe ich ein Problem mit den verschachtelten Klammern, und ich habe leider auch nicht geschafft, das experimentell herauszufinden.

Ich befürchte, ich bin seit mittlerweile 3 Tagen betriebsblind und brauche mal wieder einen Schubs in die richtige Richtung.
Für diesen Schubs in Form einer Erklärung dieses regulären Ausdrucks wäre ich wahnsinnig dankbar.

Viele liebe Grüße,
Der Dicki

  1. Tag.

    $string = preg_replace("/((<[^>]*)|$s)/ie", '"$2"=="$1"? "$1":"$t"', $string);
    ersetzt ausserhalb von spitzen Klammern alle $s durch $t.

    Tricky :-)

    Aber ich würde gerne verstehen, wie genau dieser Ausdruck das macht.

    Dann nimm ihn mal auseinander, dann wird's vielleicht deutlicher:

    $1 Anfang: (  
    $2 Anfang:   (  
    Variante 1:  <[^>]*  
    $2 Ende:     )  
    oder         |  
    Variante 2:  $s  
    $1 Ende:   )  
    Modifier:  ie
    

    Fangen wir also von vorn an:
    Der gesamte Treffer steht in $1, die spitze Klammer (kein oder mehrmals) in $2. Der i-Modifier ist sicher klar, interessant ist der e-Modifier, der bewirkt, dass der Ausdruck wie eine PHP-Anweisung ausgewertet wird (siehe Modifier /e). Somit wird nicht nach dem String "$s" gesucht, sondern nach dem Inhalt, welcher der Variable $s zugewiesen wurde. Der Ersatztext ist eine einfache PHP-Anweisung:

    $2 == $1 ? $1 : $t  
               *1   *2
    

    Ein einfaches "entweder-oder". Zunächst wird geschaut, ob der Treffer ($1) nur aus einem "Spitzklammerausdruck" ($2) besteht, falls ja, lässt der Ausdruck alles so, wie es ist (*1), anderenfalls ersetzt er den Treffer durch den Inhalt der Variablen $t (*2).

    So, ich habe versucht, das Ganze populärwissenschaftlich aufzudröseln, akademische und sonstige Fehler mögen bitte die dazu Berufenen korrigieren :-)

    Siechfred

    1. Hallihallo!

      Coole Sache. Ich gehe einfach mal davon aus, daß Deine "populärwissenschaftliche" Erklärung auch "akademisch" richtig ist.
      Auf jeden Fall glaube ich tatsächlich, ich habe es jetzt verstanden[1].
      Herzlichen Dank! :)

      Viele liebe Grüße,
      Der Dicki

      [1]akademische Korrektheit der Erklärung vorausgesetzt