PHP需要替换元素中没有包装的字符串


preg_replace php need to replace a string not already wrapped in element

我需要能够将字符串替换为将被包装在某种BBcode风格元素中的内容,但前提是该字符串尚未被包装在元素中。

的例子:

狐狸在苏丹跑得很快,但在加拿大[/country]也跑得很快

遍历我想要替换的所有国家/地区的列表,并将这个国家/地区的括号括起来,我试过这个

$replace = preg_replace("#(?<!'[country(.)'])". preq_quote($country) ."(?!'[/country'])#", "[country]{$country}[/country]", $replace);
预期输出:

狐狸在[国家]苏丹[国家]跑得很快,但在[国家]加拿大[/国家]也跑得很快

但是我实际上得到

实际输出:

狐狸在[国家]苏丹[国家]跑得很快,但在[国家]加拿大[/国家][/国家]跑得也很快

这很简单,您可以使用(*SKIP)(*FAIL)技巧跳过字符串中的所有内容:

$listOfCountries = array('France', 'Soudan', 'Quatar', 'China', 'Zimbabwe');
$pattern '~'[country][^[]+'[/country](*SKIP)(*FAIL)|'b(?i:'
       . implode('|', $listOfCountries) . ')'b~';
$result = preg_replace($pattern, '[country]$0[/country]', $text);

(*SKIP)禁止在模式失败后重试子字符串,(*FAIL)强制regex引擎失败。

注意:如果您确定国家列表只包含字母和空格,则不需要使用preg_quote。然而,如果你的列表包含像R.D.C.这样的缩写("r publique d mocratique du Congo"),最好使用preg_quote。注意,如果您在列表'b中有abbr将不再工作,您必须将其替换为其他类型的边界(因为点不在'w中),例如:(?='s|[^'PP.]) (白色字符或标点符号,不是点)

相关文章: