编程语言
首页 > 编程语言> > php-preg_replace即使在第一次替换后也可以匹配字符串中的所有匹配项

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

作者:互联网

输出:

$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);
}

标签:preg-match-all,preg-match,preg-replace,php,regex
来源: https://codeday.me/bug/20191027/1946523.html