fork download
  1. <?php
  2. $input = <<<EOD
  3. <p>sapien Cras cursus consequat nibh <a href="#">sapien</a>ac vehicula. Sed erat sapien, condimentum quis risus nec, viverra dignissim nisi. Cras sapien convallis, erat egestas tincidunt <img src="myimage.jpg" alt="sapien" >rutrum, massa enim sagittis ante, sapien.sed pellentesque lorem risus vitae enim. Curabitur hendrerit dolor facilisis <a href="sapien">sapien</a> dolor malesuada molestie.sapien</p>
  4. EOD;
  5.  
  6. // define tags which you need to exclude from replacement
  7. // as: array( start_string => end_string, ... );
  8. $ignore_tags = array(
  9. '<a' => '</a>',
  10. '<img' => '>',
  11. '<div' => '</div>'
  12. );
  13.  
  14. echo "Input:\n {$input} \n\n ";
  15. $output = parse_text($input, $ignore_tags);
  16. echo "Output:\n {$output}";
  17.  
  18. // callback function that invokes every time when 'parse_text' parses 'clean' peace of text
  19. function my_replace($text) {
  20. echo "my_replace call on: \n".$text."\n\n";
  21.  
  22. // your replacements here
  23. $text = preg_replace("#\b(sapien)\b#i", "<a href=#>\\1</a>", $text);
  24. return $text;
  25. }
  26.  
  27.  
  28. // main parsing function that split text to clean and ignored parts
  29. function parse_text($input, $ignore_tags) {
  30. $output = '';
  31. $str = '';
  32. $ignore = false;
  33. $current_ignore_tag = '';
  34. $ignore_tags_regexp = implode("|", array_keys($ignore_tags));
  35.  
  36. for ($i = 0; $i < strlen($input); $i++) {
  37. $str .= $input[$i];
  38. // if starts ignore tag and not already $ignore
  39. if (preg_match("#({$ignore_tags_regexp})$#si", $str, $m) && !$ignore) {
  40. $str = preg_replace("#({$ignore_tags_regexp})$#si", "", $str); // cut and not include ignore tag
  41. $output .= my_replace($str) . $m[1]; // replace all before and save
  42. $ignore = true;
  43. $current_ignore_tag = $m[1];
  44. $str = '';
  45. } // if $ignore and matches the end of the current ignore tag
  46. elseif ($ignore && preg_match("#({$ignore_tags[$current_ignore_tag]})$#i", $str, $m)) {
  47. $output .= $str; // just save as it is current peace
  48. $ignore = false;
  49. $str = '';
  50. }
  51. }
  52. $output .= (!$ignore) ? my_replace($str) : $str;
  53. return $output;
  54. }
  55.  
  56.  
Success #stdin #stdout 0.01s 52488KB
stdin
Standard input is empty
stdout
Input:
 <p>sapien Cras cursus consequat nibh <a href="#">sapien</a>ac vehicula. Sed erat sapien, condimentum quis risus nec, viverra dignissim nisi. Cras sapien convallis, erat egestas tincidunt <img src="myimage.jpg" alt="sapien" >rutrum, massa enim sagittis ante, sapien.sed pellentesque lorem risus vitae enim. Curabitur hendrerit dolor facilisis <a href="sapien">sapien</a> dolor malesuada molestie.sapien</p> 

 my_replace call on: 
<p>sapien Cras cursus consequat nibh 

my_replace call on: 
ac vehicula. Sed erat sapien, condimentum quis risus nec, viverra dignissim nisi. Cras sapien convallis, erat egestas tincidunt 

my_replace call on: 
rutrum, massa enim sagittis ante, sapien.sed pellentesque lorem risus vitae enim. Curabitur hendrerit dolor facilisis 

my_replace call on: 
 dolor malesuada molestie.sapien</p>

Output:
 <p><a href=#>sapien</a> Cras cursus consequat nibh <a href="#">sapien</a>ac vehicula. Sed erat <a href=#>sapien</a>, condimentum quis risus nec, viverra dignissim nisi. Cras <a href=#>sapien</a> convallis, erat egestas tincidunt <img src="myimage.jpg" alt="sapien" >rutrum, massa enim sagittis ante, <a href=#>sapien</a>.sed pellentesque lorem risus vitae enim. Curabitur hendrerit dolor facilisis <a href="sapien">sapien</a> dolor malesuada molestie.<a href=#>sapien</a></p>