最快方式是file_get_contents+str_replace处理小文件;需确保旧链接完整连续、注意编码与并发写入;HTML属性内链接宜用preg_replace;复杂场景用DOMDocument;批量处理用glob并备份。

用 file_get_contents + str_replace 最快搞定小文件
直接读取整个文件内容,批量替换链接字符串,再写回——这是最轻量、最可控的方式,适合单次更新且文件不大(比如几百 KB 以内的 HTML 或 PHP 模板)。
注意点:str_replace 是纯字符串匹配,不依赖 URL 结构,所以只要目标链接完整出现(如 https://old.com/assets/),就能替换成新地址(如 https://new.com/static/)。
- 必须确保旧链接在文件中是**完整、连续、无换行**出现的;否则
str_replace会漏掉 - 如果文件含中文路径或特殊编码(如 GBK),
file_get_contents默认按 UTF-8 读,可能乱码——先用mb_detect_encoding判断编码,必要时用iconv转换 - 替换后务必用
file_put_contents($path, $content, LOCK_EX)写入,加LOCK_EX防止并发写入冲突
正则替换 href 和 src 属性值更稳妥
当要改的是 HTML 中嵌在标签里的链接(比如 ),用字符串替换容易误伤或漏掉。这时该上 preg_replace,精准定位属性值。
示例:只替换所有 href 和 src 中以 http://old.com 开头的 URL:
立即学习“PHP免费学习笔记(深入)”;
$pattern = '/(href|src)\s*=\s*[\'"]https?:\/\/old\.com([^\'"]*)[\'"]/i'; $replacement = '$1="$2"'; // 注意这里只是示意结构,实际需拼新域名 $content = preg_replace($pattern, 'href="https://new.com$2"', $content);
- 正则里用
[^\'"]*匹配引号内任意非引号字符,比.*?更安全,避免跨属性误匹配 - 域名中的点号
.必须转义为\.,否则匹配任意字符 - 如果 HTML 是压缩格式(无空格、无换行),这个正则仍能工作;但若含 JS 字符串里的伪链接(如
console.log("href=xxx")),也会被误匹配——得加上下文判断或改用 DOM 解析
大文件或复杂 HTML?用 DOMDocument 安全解析再改
当文件超过几 MB,或需要区分真实 HTML 属性和注释/JS 字符串里的假链接时,硬正则或字符串替换就不可靠了。DOMDocument 是 PHP 原生方案,能真正理解 HTML 结构。
关键步骤:
- 用
$dom->loadHTMLFile($path)加载,记得传LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD避免自动补全 - 遍历所有带
href或src的节点:$dom->getElementsByTagName('*'),再检查$node->hasAttribute('href') - 修改前先用
filter_var($url, FILTER_VALIDATE_URL)校验是否为合法 URL,防止污染 - 写回时用
$dom->saveHTML(),不是save()——后者输出 XML 格式,会把变成,破坏部分浏览器兼容性
批量处理多个文件?别用递归遍历 glob 就够用
不需要写复杂目录扫描逻辑。PHP 自带 glob 支持通配符,比如 glob('templates/**/*.html')(需启用 GLOB_BRACE 和 PHP 5.6+)就能拉出所有子目录下的 HTML 文件。
- 用
foreach (glob('*.php') as $file)处理当前目录下所有 PHP 文件,简单直接 - 如果路径含中文或特殊符号,
glob在 Windows 下可能返回空数组——改用scandir+ 手动过滤更稳 - 每次处理前加
if (!is_writable($file)) { continue; },跳过只读文件,避免file_put_contents报错中断流程 - 别忘了备份:处理前执行
copy($file, $file . '.bak.' . date('Ymd-His')),真出问题还能快速回滚
真正麻烦的从来不是“怎么换”,而是“哪些该换、哪些不该动”。比如 CDN 地址、API 接口、埋点链接,它们看起来都是 URL,但语义和生命周期完全不同。批量脚本跑之前,最好先用 grep -r "old\.com" *.html | head -20 看一眼实际匹配到什么,比盲目执行安全得多。











