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