gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:58:47 25 4
gpt4 key购买 nike

这个输出:

$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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com