preg_replace php需要替换元素中尚未包装的字符串

preg_replace php需要替换元素中尚未包装的字符串,php,regex,Php,Regex,我需要能够用一种BBcode样式的元素中包装的内容替换字符串,但前提是该字符串尚未包装在元素中 例如: 狐狸在苏丹跑得很快,但在加拿大也跑得很快 循环浏览我想要替换的所有国家的列表,并将其放在这个国家的括号中,我尝试了这个方法 $replace = preg_replace("#(?<!\[country(.)\])". preq_quote($country) ."(?!\[/country\])#", "[country]{$country}[/country]", $replace)

我需要能够用一种BBcode样式的元素中包装的内容替换字符串,但前提是该字符串尚未包装在元素中

例如:

狐狸在苏丹跑得很快,但在加拿大也跑得很快

循环浏览我想要替换的所有国家的列表,并将其放在这个国家的括号中,我尝试了这个方法

$replace = preg_replace("#(?<!\[country(.)\])". preq_quote($country) ."(?!\[/country\])#", "[country]{$country}[/country]", $replace);

$replace=preg#u 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)
强制正则表达式引擎失败


注意:如果您确定国家列表只包含字母和空格,则不需要使用preg_quote。但是,如果您的列表包含类似缩写的R.D.C.(“刚果民主共和国”),最好使用preg_quote。小心,如果列表中的abbr
\b
不再有效,则必须用其他类型的边界替换它(因为点不在
\w
),例如:
(?=\s |[^\PP.])
(白色字符或非点的标点字符)

@KyleBrowning:在这种情况下,您可以对数组进行排序和分割。对于每个块,您可以构建包含因子中首字母的字符串,例如:
AL(BANIE | GERIA)| BE(LGIQUE | N(In | GLADESH))…
(您可以手工构建,但我相信可以构建一个函数来一劳永逸地为您完成此任务)类似于。示例模式:
searchtext(?![^\[]*>[^\]]*\[\/)
@bloodyKnuckles:但是,这是一种缓慢的方式,因为您必须向前搜索字符串中的每个国家/地区。