我不能告诉你们我花了多少小时在这件事上。我只想忽略强标记之间的任何关键字实例。无论它们是直接在标签旁边,还是介于其他单词之间。同时保持关键字大小写不敏感。
例子:

The man drove in his car. Then <strong>the man walked to the boat.</strong>

应忽略并替换boat一词。
$keywords = array(
'boat',
'car',
);

$p = implode('|', array_map('preg_quote', $keywords));

$string = preg_replace("/\b($p)\b/i", 'gokart', $string, 4);

最佳答案

您可以使用SKIP-FAIL regex只替换明显在非相同分隔符之外的东西:

<strong>.*?<\/strong>(*SKIP)(*FAIL)|\b(boat|car)\b

参阅demo
这里有一个IDEONE demo
$str = "The man drove in his car.Then <strong>the man walked to the boat.</strong>";
$keywords = array('boat','car');
$p = implode('|', array_map('preg_quote', $keywords));
$result = preg_replace("#<strong>.*?<\/strong>(*SKIP)(*FAIL)|\b($p)\b#i", "gokart", $str);
echo $result;

注意,在这种情况下,我们很可能对skip-fail块中的tempered greedy token解决方案不感兴趣(这是我最初发布的,请参阅修订历史),因为我们不关心分隔符之间的内容。

关于php - preg_replace关键字OUTSIDE的<strong>标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30724791/

10-09 20:34