这个输出:
$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/