preg_replace <strong> apple <strong>树</strong> </strong>

时间:2011-12-28 12:20:49

标签: php preg-replace

所以问题..我现在已经坚持这个好月了,所以请任何帮助都会非常感激。

我试图用数组中的单词突出显示字符串中的单词。我遇到的问题是嵌套标签。

$bold=array();
$bold="tree,apple tree,orange";
$description="orange and apple tree";

例如; the result I want would be this <strong>orange</strong> and <strong>apple tree</strong>, but the result I am getting is this <strong>orange</strong> and <strong>apple <strong>tree</strong></strong>

我拼凑了这个,但它不能按预期工作,所以如果我的方法不正确,请随意修改或删除。

function highlightWords($text, $words){
 foreach ($words as $word){
  $word = preg_quote($word);
  $word = (str_replace("/","",$word));
  $text = preg_replace("/(?!<.*?)(".preg_quote($word,'/').")(?![^<>]*?>)/si",'<strong>\1</strong>', $text);
 }
 return $text;
}
$description =  highlightWords($description, $bold);

2 个答案:

答案 0 :(得分:1)

如果我已正确理解您的问题,这是您的解决方案:

function highlightWords($text, array $words){
  $words = array_map(preg_quote, $words);
  return preg_replace('/(' . implode('|', $words). ')/is', '<strong>$1</strong>', $text);
}

$text = 'orange and aPPle tree';
$boldWords = array('tree', 'apple tree', 'orange');

$text =  highlightWords($text, $boldWords);
echo $text;

示例:http://www.ideone.com/at4lw

使用初始文本和要突出显示的单词数组调用函数highlightWords。该函数返回带有突出显示的单词的文本。

答案 1 :(得分:1)

很棒的答案。就个人而言,我也提到你应该(或可能)修改它只是为了寻找整个单词。例如,如果你的$ boldWords包含'ad',如果你的文字包含'lead'和'have',那么你最终会有一些奇怪的东西。

使用\ b添加单词“boundary”以仅匹配整个单词。

return preg_replace('/\b(' . implode('|', $words). ')\b/is', '<strong>$1</strong>', $text);