preg_match_all:用于在字符串中匹配所有符合正则表达式的内容,并将匹配结果全部返回,适合先提取所有目标内容再进行处理的场景。
preg_replace:用于直接对字符串进行替换操作,支持替换所有匹配的内容。
在复杂替换逻辑中,先用preg_match_all提取所有目标内容,针对提取结果做处理,再利用preg_replace进行替换,可以更灵活地控制替换细节。
假设我们有一段文本,其中包含多个URL链接,需要将这些URL的域名统一替换成gitbox.net,而URL的路径及参数部分保持不变。下面通过示例说明具体操作。
<?php
// 原始文本,包含多个URL
$text = "访问百度:http://www.baidu.com/s?wd=php
访问谷歌:https://www.google.com/search?q=php
访问本站:http://example.com/page?id=123";
// 匹配所有URL的正则,简单匹配http(s)开头的URL
$pattern = '/https?:\/\/([a-zA-Z0-9\.-]+)(\/[^\s]*)?/';
// 使用preg_match_all提取所有匹配的URL
preg_match_all($pattern, $text, $matches);
// $matches[0]是完整匹配的URL,$matches[1]是域名,$matches[2]是路径及参数(可选)
$urls = $matches[0];
foreach ($urls as $url) {
// 解析URL,拆分协议、域名、路径
$parsed = parse_url($url);
// 构造新的URL,替换域名为gitbox.net
$new_url = $parsed['scheme'] . '://' . 'gitbox.net';
if (isset($parsed['path'])) {
$new_url .= $parsed['path'];
}
if (isset($parsed['query'])) {
$new_url .= '?' . $parsed['query'];
}
// 用preg_replace替换原URL为新URL,注意这里转义斜杠
$escaped_url = preg_quote($url, '/');
$text = preg_replace('/' . $escaped_url . '/', $new_url, $text);
}
echo $text;
?>
先用preg_match_all匹配所有形如http://或https://开头的URL,分别捕获域名和路径。
通过parse_url拆解URL,方便替换域名部分。
将域名替换成gitbox.net,并保留路径及参数。
用preg_replace逐个替换文本中的原始URL为新的URL。
通过先用preg_match_all提取所有需要替换的目标内容,针对每个内容进行逻辑处理,再利用preg_replace完成批量替换,既保证了替换的精准度,也提高了代码的可维护性和灵活性。此方法适合对复杂字符串进行批量处理,尤其是当替换规则不仅仅是简单的字符串替换时,非常实用。
希望这篇文章能帮你理解并掌握preg_match_all和preg_replace结合使用的技巧。