seth_not@home: Lieber so ...

Beitrag lesen

gudn tach!

Und dann glaubst du, dass dieses Suchmuster funktioniert?

$suchmuster = "(?<!<[^<>]*)banane(?![^<>]*>)";

angenommen ereg haette keine probleme mit negative assertions variabler laenge (so wie z.b. der texteditor vim, der kann naemlich in dieser hinsicht erstaunlicher mehr als perl), dann sollte diese regexp imho funzen.

in vim waere das regexp-pattern uebrigens
  s/(<[^<>]*)@<!banane([^<>]*>)@!/abbl/g
und hat einen kleinen test von mir bestanden. (iow: vim ist toll!)

kurzer versuch einer erklaerung; ich denke, dass der parser folgendermassen vorgeht:
1. "banane" suchen.
2. schauen, ob davor irgendwie das pattern <[^<>]* angewendet werden kann.
3. falls ja: doofe "banane"; weiter bei punkt 2. (naechste "banane" suchen)
4. falls nein: oha, kanditat gefunden. ueberpruefe restliches pattern.
5. ist es moeglich, nach der "banene" das pattern [^<>]*> matchen zu lassen?
6. falls ja: doofe "banane"; weiter bei punkt 2. (naechste "banane" suchen)
7. falls nein: yeah, die "banane" erfuellt alle kriterien, um ersetzt zu werden.

$muster = '/banane(?=[^>]*<[^>]+>)/i';
$ersatz = 'ananas';
$ergebnis = preg_replace($muster, $ersatz, $heuhaufen);

scheitert an
  "banane"
weil danach nie mehr eine spitze klammer kommt.

besser:
http://www.php-faq.de/q/q-regexp-ersetzen.html

prost
seth