所以问题..我现在已经坚持这个好月了,所以请任何帮助都会非常感激。
我试图用数组中的单词突出显示字符串中的单词。我遇到的问题是嵌套标签。
$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);
答案 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);