php - preg_replace 即使在第一次替换之后也匹配字符串中的所有匹配项

标签 php regex preg-replace preg-match preg-match-all

这个输出:

$san_field = 'sometext PROS sometext sometext1234 CALEND 2007 RIT';
$pattern = '/(\s|^|- |--)(?:CALEND|2007|CALEND 2007 RIT)(--| -|\s|$)/i';
echo preg_replace($pattern, ' ', $san_field)

>> sometext PROS sometext sometext1234 2007 RIT

我想替换 CALEND 2007 RIT 而不是 CALEND,这是在 $san_field 上找到的第一个匹配项。 我知道我可以这样做:

$san_field = 'sometext PROS sometext sometext1234 CALEND 2007 RIT';
$pattern = '/(\s|^|- |--)(?:CALEND 2007 RIT|CALEND|2007)(--| -|\s|$)/i';
echo preg_replace($pattern, ' ', $san_field)

>> sometext PROS sometext sometext1234

但是有没有更正确和实用的方法,因为我会将这些模式插入到一个相当大的数组中......

最佳答案

如何将这些模式放入一个数组,按长度对该数组进行排序(以便首先检查较长的文本),然后构建您的正则表达式?

$replace = ["2007", "CALEND", "CALEND 2007 RIT"];
usort($replace, function($a, $b){
    return strlen($b) - strlen($a);
});
$san_field = 'sometext PROS sometext sometext1234 CALEND 2007 RIT';
$pattern = '/(\s|^|- |--)(?:'.(implode('|', $replace)).')(--| -|\s|$)/i';
echo preg_replace($pattern, ' ', $san_field)

此外,preg_quote 这些值是个好主意,以防万一您放入一些特殊字符。

foreach($replace as &$item) {
    $item = preg_quote($item);
}

关于php - preg_replace 即使在第一次替换之后也匹配字符串中的所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33600730/

相关文章:

javascript - PHP通过json废墟数组转Jquery

php - 从 mysql 获取空白输出。以前从未使用过 "%s"

PHP:MySQL 服务器已经消失

javascript - 用于在 PHP 上剥离 javascript 的正则表达式

php - 无法使用 CentOS 发行版写入特定目录

c# - 查找第一个属性不是 'title' 的所有 <a> 标签

javascript - 使用变量时转义正则表达式中的方括号?

PHP preg_replace 单行,忽略多行可能吗?

PHP preg_replace - 使用匹配项作为键从数组中查找替换项

php - 如何测试输入字段是否包含外来字符?