in reply to Highlight a substring

see: index and substr

my $string1 = 'realy long string of html'; my $string2 = 'long'; my $index = index($string1, $string2); while($index > 0){ substr($string1, $index, length($string2), '<b>'.$string2.'</b>'); $index = index($string1, $string2, ($index + length($string2))); }

A truely compassionate attitude towards other does not change, even if they behave negatively or hurt you

—His Holiness, The Dalai Lama

Replies are listed 'Best First'.
Re^2: Highlight a substring
by ikegami (Patriarch) on Apr 06, 2005 at 15:23 UTC

    That should be
    while ($index >= 0) {
    and not
    while ($index > 0) {

Re^2: Highlight a substring
by the_0ne (Pilgrim) on Apr 06, 2005 at 17:02 UTC
    I have more of a question than a comment. The first thing I would have thought to do was this...
    my $string1 = 'realy long string of html and here is the word long aga +in'; my $string2 = 'long'; + $string1 =~ s/($string2)/<b>$1<\/b>/g; + print "string1: $string1\n";

    I know tmtowtdi, but is there another reason that the 2 responses to MonkPaul's question didn't involve s///g?

    Thanks again oh wise monks.
      index is much faster than m// when matching a constant string. I'm guessing index + substr is similarly faster than s///. Feel free to benchmark the two.

      By the way,
      $string1 =~ s/($string2)/<b>$1<\/b>/g;
      should be replaced with
      $string1 =~ s/(\Q$string2\E)/<b>$1<\/b>/g;
      in case $string2 contains special characters. Better yet,
      $string1 =~ s/((?:\Q$string2\E)+)/<b>$1<\/b>/g;
      should be a little bit faster.

      I'd also Benchmark the following which has fewer concatenations:

      $string1 =~ s#(?=(?:\Q$string2\E)+)#<b>#g; $string1 =~ s#(?<=(?:\Q$string2\E)+)#</b>#g;