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.])
(白色字符或标点符号,不是点)