ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-27 19:33:40  阅读:263  来源: 互联网

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


输出:

$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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有