求助编写PHP preg_replace正则,替换JSON中不一致的上传路径值
JSON字符串中批量替换WordPress上传路径的正则方案
问题分析
你之前用的正则#/wp-content/uploads/sites/(.*?)/#i因使用非贪婪匹配.*?,仅匹配到sites/后的第一个斜杠就停止,导致后续路径直接拼接在替换值后,出现类似/wp-content/uploads/sites/178/2023/032022/06/banner-swx.jpg的错误结果。
解决方案
需要调整正则逻辑,精准匹配到图片文件名前的最后一个斜杠,确保替换整个目标目录路径。结合JSON字符串的特性(路径被引号包裹),使用以下方案:
正则表达式
#/wp-content/uploads/sites/.*?/(?=[^/"]+")#i
代码示例
// 获取WordPress上传目录URL $replace = wp_upload_dir()['url']; // 构建匹配规则:匹配JSON中图片路径的完整目录部分(直到文件名前的斜杠) $pattern = '#/wp-content/uploads/sites/.*?/(?=[^/"]+")#i'; // 执行替换,在替换值后添加斜杠以保持路径结构完整 $jsondata = preg_replace($pattern, $replace . '/', $jsondata);
正则规则说明
/wp-content/uploads/sites/:匹配路径的固定开头片段.*?/:非贪婪匹配任意字符,直到遇到目标路径的最后一个斜杠(?=[^/"]+"):正向预查,确保后续内容是不含斜杠和引号的文件名,直到闭合引号,避免误匹配JSON中的其他内容
纯路径场景适配
如果处理的是不含引号的纯路径字符串,可简化正则为:
#/wp-content/uploads/sites/.*?/(?=[^/]+$)#i
此时预查规则改为匹配到字符串结尾的文件名,同样能精准定位最后一个斜杠。
内容的提问来源于stack exchange,提问作者Nadal
相关产品推荐
相关产品推荐

