preg_replace关键字OUTSIDE的<strong>标签

时间:2015-06-09 06:46:10

标签: php regex

我无法告诉你们我在这个上花了多少个小时。我只想 IGNORE BETWEEN 强标记的任何关键字实例。它们是直接位于标签旁边还是介于两者之间。同时保持关键字不区分大小写。

示例:

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

应忽略单词boat,并替换Car

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

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

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

2 个答案:

答案 0 :(得分: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解决方案不感兴趣(我最初发布,请参阅修订历史记录),因为我们没有关心分隔符之间的内容。

答案 1 :(得分:0)

正则表达式可能不是做这种事情的最佳方式。

最好使用DOM解析器或类似的东西来正确查找<strong>标记。

这里的一些答案提供了一些不错的选择:RegEx: Matching text that is not inside and part of a HTML tag