are you sure about that? at 1st sight seems that you're using lookbehind assertion inccorectly... so i run a test code over you function:
#!/usr/bin/perl -w
use strict;
my $terms = 'tree crow black blue green stars';
my $color = '#CC0000';
my $string1= qq!\tthe black crow is sitting in the <font color="blue">
+tree</font> looking at the green stars!;
my $string2= qq!\tthe black crow is sitting in the blue tree looking a
+t the green stars!;
print 'Terms: '.$terms.$/x2;
print 'text1:'.$/.$string1.$/;
print 'parsed1:'.$/.HTMLhighlight($terms,$string1,$color).$/;
print 'text2:'.$/.$string2.$/;
print 'parsed2:'.$/.HTMLhighlight($terms,$string2,$color).$/;
sub HTMLhighlight {
my($searchterms,$instr,$color) = @_;
my (@terms)=split(/\ /,$searchterms);
foreach my $i (0..$#terms) {
$instr =~ s/(?!<.*)($terms[$i])(?!.*>)/<b style=\"background:$colo
+r\">$1<\/b>/gi;
}
return $instr;
}
# a easier way to do the same thing =]
sub HTMLhighlight2 {
my ($searchterms,$instr,$color) = @_;
$searchterms =~ s/\s+/|/g;
$instr =~ s#($searchterms)#<b style="background:$color">$1</b>#gi;
return $instr;
}
the output is something like this (hope that *code* will keep html tags parsing off :)) ):
Terms: tree crow black blue green stars
text1:
the black crow is sitting in the <font color="blue">tree</font> lo
+oking at the green stars
parsed1:
the black crow is sitting in the <font color="blue">tree</font> lo
+oking at the <b style="background:#CC0000">green</b> <b style="backgr
+ound:#CC0000">stars</b>
text2:
the black crow is sitting in the blue tree looking at the green st
+ars
parsed2:
the black crow is sitting in the blue <b style="background:#CC0000
+">tree</b> looking at the <b style="background:#CC0000">green</b> <b
+style="background:#CC0000">stars</b>
not so good.. i don't have yet an elegant solution for exempting searchterms to be parsed when inside html code but still provided you the htmlhighlight2 .. that look a little bit more efficient ;-] (ofc, skipped the futile lookbehind assertions)
-- AltBlue. |