snoot: Frage zu einem regulären Ausdruck

Hi,

ich lasse mit preg_replace Wörter nur außerhalb von Tags ersetzen (damit es z.B. Links nicht zerschießt):

"/((<[^>]*)|$search_str)/ie" (http://php-faq.de/q-regexp-ersetzen.html)

Jetzt würde ich gerne, dass nur ganze Wörter ersetzt werden, dafür gibt es ja den Modifier \b. Ist es korrekt, diesen wie folgt einzubauen:

"/((<[^>]*)|\b$search_str\b)/ie"

Soweit ich es sehe funktioniert es, aber vermutlich finde ich in ein paar Tagen wieder eine Situation, wo das nicht der Fall ist :)

Vielleicht könnte mir auch jemand erklären, wie der komplette Ausdruck genau arbeitet, denn wirklich durchschauen kann ich ihn nicht:

~~~php // $s case-insensitive in $t hervorheben:
  preg_replace("/((<[^>]*)|$s)/ie", '"\2"=="\1"? "\1":"<b>\1</b>"', $t);

  
  
Danke schon mal.
  1. Hi!

    Vielleicht könnte mir auch jemand erklären, wie der komplette Ausdruck genau arbeitet, denn wirklich durchschauen kann ich ihn nicht:

    ~~~php

    // $s case-insensitive in $t hervorheben:

    preg_replace("/((<[^>]*)|$s)/ie", '"\2"=="\1"? "\1":"<b>\1</b>"', $t);

      
    Gematcht werden Elemente, die entweder "<" bis ausschließlich ">" sind, und $s, was auch immer darin stehen mag. In der Ersetzung ist eine Abfrage in Kurzform:  
      
    [Bedingung] ? [falls wahr] : [andernfalls], die innerhalb der Abfrage umgesetzt wird. durch die doppelte Klammerung der Tags wird ein so gematchtes Tag sowohl in \1 als auch in \2 gespeichert. Wenn also \1 gleich \2 ist, also ein Tag geparst wurde, wird dieses unverändert zurückgegeben, ansonsten wird, wenn \2 leer ist, also kein Tag gematcht wurde, <b>$s</b> zurückgegeben.  
      
    Das Ergebnis ist, dass $s in <b>-Tags gesetzt wird, es sei denn, es steht in einem Link. Diese Ersetzung hätte man auch verständlicher und/oder eleganter machen können, aber sicher kaum kürzer oder schneller.  
      
    Gruß, LX
    
    -- 
    RFC 1925, Satz 8: Es ist komplizierter als man denkt.
    
    1. Hm, vielen Dank schon mal, aber so wirklich versteh ich's noch nicht.

      Das ist klar:

      [Bedingung] ? [falls wahr] : [andernfalls]

      Aber wie die Klammerung genau funktioniert!? Ich suche nach ((<[^>]*)|$s), also wäre ja eigentlich \1 = <[^>]*|$s und \2 = <[^>]* .. aber das ergibt doch keinen Sinn. \1 kann ja nicht zugleich das eine oder das andere sein. Und es würde ja nur dann \1 == \2 gelten, wenn $s leer wäre!?

      Ich versteh nur Bahnhof.