Jump to content


Photo

Search and replace outside <> tags


  • Please log in to reply
2 replies to this topic

#1 razedk

razedk
  • New Members
  • Pip
  • Newbie
  • 2 posts

Posted 30 June 2006 - 07:56 PM

Hi,

I want to make a search and all normal text, ie outside HTML tags

Example 1:

Hello, I want to hightlight <a href="mailto:raze@mail.com">raze@raze.com</a>

should become

Hello, I want to hightlight <a href="mailto:raze@mail.com"><b style="color:blue;"raze</b>@mail.com</a>

Example 2:

Hello, my name is raze

should become

Hello, my name is <b style="color:blue;"raze</b>

Right now I have the following code, but it does not work with example 1, because it replaces raze inside the <a href> tag. How can I avoid that ?

$word = "raze";
$highlighted_line = preg_replace( "'($word)'si" ,  "<b style=\"color:blue;\">\\1</b>" , $line);






#2 effigy

effigy
  • Staff Alumni
  • Advanced Member
  • 3,600 posts
  • LocationIL

Posted 30 June 2006 - 08:16 PM

<?php

	$tests = array(
		'<a href="mailto:Bob@Bob.com">E-mail</a> Bob.',
		'<a href="mailto:Bob@Bob.com">Bob</a>',
		'Bob',
		'<a href="mailto:Sue@Sue.com">Sue</a>',
	);

	### For each test...
	foreach ($tests as $test) {
		echo '<hr /><b>Analyzing: ', htmlentities($test), '</b><br />';
		### ...separate the tags from the text.
		$pieces =
			preg_split(
				'/(<.+?>)/',
				$test,
				-1,
				PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
			);
		### For each piece...
		foreach ($pieces as &$piece) {
			### ...make the substitution on the non-tag pieces.
			if (strpos($piece, '<') === FALSE) {
				echo $piece, '<br>';
				$piece = str_replace('Bob', 'Bill', $piece);
			}
			### ...and ignore the tag pieces.
			else {
				echo 'Skipping ', htmlentities($piece), '<br>';
			}
		}
		### Now put them back together...
		$string = implode('', $pieces);
		echo '<b>Final: ', htmlentities($string), '</b><br>';
	}
	
?>

Regexp | Unicode Article | Letter Database
/\A(e)?((1)?ff(?:(?:ig)?y)?|f(?:ig)?)\z/

#3 razedk

razedk
  • New Members
  • Pip
  • Newbie
  • 2 posts

Posted 30 June 2006 - 09:37 PM

Hurray, preg_split did the work... here is the complete code


function highlight_words ($text, $searchdata, $bold) {

  $word_array = explode(" ", $searchdata);

  $text_pieces = preg_split("'(<.+?>)'", $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

  $i = 0;

  foreach ($text_pieces as $piece) {

    if (strpos($piece, '<') === FALSE) {

      foreach ($word_array as $word) {
        if ($bold == 1) {

          $piece = preg_replace( "'($word)'si" , "<b style=\"color:blue;\">\\1</b>" , $piece);

        } else {
          $piece = preg_replace( "'($word)'si" , "<span style=\"color:blue;\">\\1</span>" , $piece);
        }
      }  //end foreach $word_array


    }

    $new_text_pieces[$i] = $piece;
    $i++;

  } //end foreach $text_pieces

  $text = implode('', $new_text_pieces);
  return $text;
}






0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users