Jump to content


This topic is now archived and is closed to further replies.


Search and replace outside <> tags

Recommended Posts


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);

Share this post

Link to post
Share on other sites

$tests = array(
'<a href="mailto:Bob@Bob.com">E-mail</a> Bob.',
'<a href="mailto:Bob@Bob.com">Bob</a>',
'<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 =
### 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>';


Share this post

Link to post
Share on other sites
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;

  } //end foreach $text_pieces

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


Share this post

Link to post
Share on other sites


Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.