razedk Posted June 30, 2006 Share Posted June 30, 2006 Hi,I want to make a search and all normal text, ie outside HTML tagsExample 1:Hello, I want to hightlight <a href="mailto:[email protected]">[email protected]</a>should becomeHello, I want to hightlight <a href="mailto:[email protected]"><b style="color:blue;"raze</b>@mail.com</a>Example 2:Hello, my name is razeshould becomeHello, 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); Link to comment https://forums.phpfreaks.com/topic/13333-search-and-replace-outside-tags/ Share on other sites More sharing options...
effigy Posted June 30, 2006 Share Posted June 30, 2006 [code]<?php $tests = array( '<a href="mailto:[email protected]">E-mail</a> Bob.', '<a href="mailto:[email protected]">Bob</a>', 'Bob', '<a href="mailto:[email protected]">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>'; } ?>[/code] Link to comment https://forums.phpfreaks.com/topic/13333-search-and-replace-outside-tags/#findComment-51414 Share on other sites More sharing options...
razedk Posted June 30, 2006 Author Share Posted June 30, 2006 Hurray, preg_split did the work... here is the complete code[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;}[/code] Link to comment https://forums.phpfreaks.com/topic/13333-search-and-replace-outside-tags/#findComment-51447 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.