You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:05:26