如何用PHP正则替换含www的指定主域名,保留子域名对应域名?
问题描述
我正在PHP中尝试使用preg_replace或str_replace替换包含www的指定域名,现有代码如下:
$string = ' https://example.com, https://www.example.com, https://subdomain.example.com '; $olddomain= "example.com"; $newdomain = "stackoverflow.com"; $output = str_replace($olddomain, $newdomain, $string); $output = preg_replace('#(www[.])?[.]' . $olddomain. '#', $newdomain, $body); echo $output;
期望实现的效果为:
https://example.com -> https://stackoverflow.com https://www.example.com -> https://stackoverflow.com https://subdomain.example.com -> https://subdomain.example.com
请问如何正确实现该需求?
解决方案
现有代码存在两处问题:一是变量名错误(使用了未定义的$body而非$string),二是正则表达式匹配逻辑有误,会误处理子域名场景。以下是两种可行的实现方案:
方案一:正则表达式(精准匹配推荐)
通过正则捕获协议部分,同时限定域名边界,确保仅替换独立的顶级域名或带www前缀的版本,不影响子域名:
$string = ' https://example.com, https://www.example.com, https://subdomain.example.com '; $olddomain = "example.com"; $newdomain = "stackoverflow.com"; // 正则匹配http/https协议后的目标域名,包含可选的www前缀 $output = preg_replace('#(https?://)(www\.)?' . preg_quote($olddomain, '#') . '\b#', '$1' . $newdomain, $string); echo $output;
关键逻辑说明:
(https?://):捕获http或https协议部分,替换时保留该部分(www\.)?:可选匹配www.前缀preg_quote($olddomain, '#'):对原域名中的特殊字符(如.)转义,避免正则语法冲突\b:单词边界,确保不会匹配子域名中包含的example.com片段
方案二:str_replace分阶段处理
若偏好不用正则,可分两次替换,先处理带www的域名,再处理纯顶级域名:
$string = ' https://example.com, https://www.example.com, https://subdomain.example.com '; $olddomain = "example.com"; $newdomain = "stackoverflow.com"; // 先替换www.example.com为新域名 $output = str_replace('www.' . $olddomain, $newdomain, $string); // 再替换协议后的纯顶级域名,避免影响子域名 $output = str_replace('://' . $olddomain, '://' . $newdomain, $output); echo $output;
关键逻辑说明:
- 优先替换带www的完整域名,避免后续操作干扰
- 替换纯顶级域名时带上
://前缀,确保仅匹配协议后的独立域名,不会误替换子域名内的目标域名片段
内容的提问来源于stack exchange,提问作者Mehul Kumar
相关产品推荐
相关产品推荐

