preg_replace 关键字位于 <strong> 标签之外

jet*_*ets 4 php regex

我无法告诉你们我在这件事上花了多少时间。我只是想忽略标签之间的任何关键字实例。它们是否直接位于标签旁边,或者与其他单词位于两者之间。同时保持关键字不区分大小写。

例子:

The man drove in his car. Then <strong>the man walked to the boat.</strong> 
Run Code Online (Sandbox Code Playgroud)

该词boat应被忽略并Car应被替换。

$keywords = array(
'boat',
'car',
);

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

$string = preg_replace("/\b($p)\b/i", 'gokart', $string, 4);
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 5

您可以使用SKIP-FAIL 正则表达式来仅替换明显位于不同分隔符之外的内容:

<strong>.*?<\/strong>(*SKIP)(*FAIL)|\b(boat|car)\b
Run Code Online (Sandbox Code Playgroud)

查看演示

这是IDEONE 演示

$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;
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,我们很可能对 SKIP-FAIL 块内的调和贪婪令牌解决方案不感兴趣(我最初发布的,请参阅修订历史记录),因为我们不关心分隔符之间的内容。