PHP中替换域名时如何排除图片扩展名?
域名替换解决方案(排除图片链接)
现有代码问题分析
原代码使用str_replace进行粗暴替换,存在以下问题:
- 无差别替换所有
example.com,包括图片链接中的域名,违反排除规则 - 错误删除图片扩展名,而非保留原链接
- 处理
www.的逻辑会破坏带图片扩展名的www.example.com结构
正确实现代码
$body = ' www.example.com, example.com, example.com/hello.html, example.com/logo.png, example.com/yourbaby.php , example.com/newimage.jpg, www.example.com/newimage.jpg'; $oldDomain = 'example.com'; $newDomain = 'sample.com'; $excludeExtensions = ['png', 'jpg', 'jpeg']; // 构建正则:匹配包含目标域名的链接,排除结尾为指定图片扩展名的情况 $pattern = '/(https?:\/\/)?((?:[a-zA-Z0-9-]+\.)?)' . preg_quote($oldDomain, '/') . '(?!.*\.(?:' . implode('|', $excludeExtensions) . '))/i'; // 回调替换:保留协议、子域名,仅替换主域名 $body = preg_replace_callback($pattern, function($matches) use ($newDomain) { $protocol = $matches[1] ?? ''; $subdomain = $matches[2] ?? ''; return $protocol . $subdomain . $newDomain; }, $body); echo $body;
代码逻辑说明
正则表达式:
(https?:\/\/)?:可选匹配http/https协议前缀((?:[a-zA-Z0-9-]+\.)?):可选匹配子域名(如www.、subdomain.)preg_quote($oldDomain, '/'):转义域名中的特殊字符,避免正则语法冲突(?!.*\.(png|jpg|jpeg)):负向预查,确保匹配到的域名后不会出现图片扩展名,实现排除规则
回调替换:
保留匹配到的协议和子域名,仅将example.com替换为sample.com,精准符合需求中的替换规则。
输出结果
sample.com, sample.com, sample.com/hello.html, example.com/logo.png, sample.com/yourbaby.php , example.com/newimage.jpg, www.example.com/newimage.jpg
内容的提问来源于stack exchange,提问作者Mehul Kumar
相关产品推荐
相关产品推荐

