我有一个单词列表(在数组中)以字符串($ text)突出显示。这是我的代码
$text = " A string with a spans and color highlighted";
$words = array('and','span');
foreach($words as $word){
$patterns[] = '/'.$word.'/i';
}
foreach($words as $word){
$replacements[] = "<span style='color:red;font-weight:bold;'>".$word."</span>";
}
echo preg_replace($patterns, $replacements, $text);
我想用$ text替换单词span和color,但结果有所不同,它也取代了html标签范围。我怎样才能克服这个问题。或者我可以替代这个。
您可以在这里重现问题。 http://writecodeonline.com/php/
提前致谢。
答案 0 :(得分:1)
您不需要为列表中的每个单词生成模式和替换字符串。您只需要构建一个模式和一个带有反向引用的替换字符串:
$text = " A string with a span and color highlighted";
$words = array('and', 'span');
$pattern = '~\b(?:' . implode('|', $words) . ')\b~';
$replacement = '<span style="color:red;font-weight:bold;">$0</span>';
$result = preg_replace($pattern, $replacement, $text);
在替换字符串中,反向引用$0
指的是整个匹配结果。
由于您只解析字符串一次,因此可以避免此问题。
答案 1 :(得分:0)
这是一个更简单的解决方案,使用explode
函数:
$text = "A string with a span and color highlighted";
$words = array('and','span');
$exploded = explode(" ", $text);
$i = 0;
foreach ($exploded as $word) {
if (in_array($word, $words)) {
$exploded[$i] = "<span style='color:red;font-weight:bold;'>".$word."</span>";
}
$i++;
}
print_r($exploded);
结果:
Array
(
[0] => A
[1] => string
[2] => with
[3] => a
[4] => <span style='color:red;font-weight:bold;'>span</span>
[5] => <span style='color:red;font-weight:bold;'>and</span>
[6] => color
[7] => highlighted
)