我有一个单词数组,用于突出显示字符串中的单词,但是有些单词可能会作为短语的一部分出现,因此我希望该短语优先于突出显示中的单个单词:
例如:
$seo = ['apple', 'apple tree', 'orchard'];
$description = "In my orchard I have a large Apple Tree";
期望的效果:
In my <strong>orchard</strong> I have a large <strong>Apple Tree</strong>
在我自己的第一次尝试中,我循环遍历了正在运行的数组preg_replace()
反对字符串,但我得到像这样的嵌套高亮<strong><strong>Apple</strong> Tree</strong>
.
首先,您不应该使用循环来单独替换每个单词,而应该使用正则表达式替代列表(foo|bar|thingy)
.
$rx_words = implode("|", array_map("preg_quote", $words));
$text = preg_replace("/\b($rx_words)\b/i",
(实际上 preg_quote 错过了第二个参数,但只要关键字中没有正斜杠,它就会起作用。)
然后你还可以通过断言使其更安全:
$text = preg_replace("/(?<!<strong>)\b($rx_words)\b/i",
所以它会忽略已经包装的单词。这只是一种解决方法,但通常就足够了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)