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 somewhere 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. But not this instance of sun, because it is between italics. This sun though, should be bold again.”
So I went like this:
$replace_with = “sun”;
$string = “The sun must be bold. But not this instance of sun because it is between italics. This sun though, should be bold again.”;[/php]
This will make all instances of sun bold:
[php]preg_replace("/$triggerword/", $replace_with, $string);[/php]
I figured I needed negative lookahead to spot the closing tag:
[php]preg_replace("/$triggerword(?!.*</i>)/", $replace_with, $string);[/php]
That works. The first and second SUN are no longer bold as expected.
Now a negative lookbehind to spot the opening tag:
[php]preg_replace("/(?<!.)$triggerword(?!.</i>)/", $replace_with, $string);[/php]
But that doesn’t seem to work, apparently because lookbehind may not be variable length. But I cannot use fixed length because the number of characters following the 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 completely different approach to achieve the same result. Thanks in advance.