Hi
It seems I have finally arrived at a problem requiring regular expressions (never needed them before). It tried my best, but I could use some help.
Simplified problem: I need to replace a word in a text, but with exceptions. If the word is between two specific (html) tags, I must not be replaced. Example: In the sentence below I need to make all words 'sun' bold, except the second one because it is somewhere between italics.:
"The word sun must be bold. <i>But not this instance of sun, because it is between italics</i>. This sun though, should be bold again."
So I went like this:
$triggerword="sun";
$replace_with = "<b>sun</b>";
$string = "The sun must be bold. <i>But not this instance of sun because it is between italics</i>. This sun though, should be bold again.";
This will make all instances of sun bold:
preg_replace("/$triggerword/", $replace_with, $string);
I figured I needed negative lookahead to spot the closing </i> tag:
preg_replace("/$triggerword(?!.*<\/i>)/i", $replace_with, $string);
That works. The first and second SUN are no longer bold as expected.
Now a negative lookbehind to spot the opening <i> tag:
preg_replace("/(?<!<i>.*)$triggerword(?!.*<\/i>)/i", $replace_with, $string);
But that doesn't seem to work, apparantly because negative lookbehind may not be variable length. But I cannot use fixed length because the number of characters following the <i> tag ARE variable.
So now I am kind of stuck. Any ideas? Part of me thinks I am missing the easy way out. I am also interested in a solution using a completely different method. Thanks in advance.