使用preg_replace添加g:id2标签的正则匹配问题求助
解决方案
针对你的需求,这里提供一个可用的preg_replace正则替换方案,同时兼顾大文件的处理场景:
正则替换核心逻辑
通过正则捕获原<g:id>标签的完整内容,同时提取出-之前的字符段,作为新增<g:id2>标签的内容。
基础替换代码(适用于小文件)
如果确定所有目标ID都包含-后缀,可直接使用以下代码:
// 读取源文件内容 $content = file_get_contents('source-file.xml'); // 正则匹配模式 $pattern = '/(<g:id><!\[CDATA\[)([^-]+)(-[^\]]*)(\]\]><\/g:id>)/'; // 替换规则:保留原标签,追加g:id2标签 $replacement = '$1$2$3$4<g:id2><![CDATA[$2]]></g:id2>'; // 执行替换并写入新文件 file_put_contents('processed-file.xml', preg_replace($pattern, $replacement, $content));
兼容无-的ID场景
如果存在部分ID没有-后缀,可调整正则让后缀部分变为可选,确保这类ID也能生成g:id2(内容与原ID一致):
$pattern = '/(<g:id><!\[CDATA\[)([^-]+)(-[^\]]*)?(\]\]><\/g:id>)/';
大文件优化处理
若文件体积过大,一次性读取会占用大量内存,建议采用逐行处理的方式:
$input = fopen('source-file.xml', 'r'); $output = fopen('processed-file.xml', 'w'); $pattern = '/(<g:id><!\[CDATA\[)([^-]+)(-[^\]]*)?(\]\]><\/g:id>)/'; $replacement = '$1$2$3$4<g:id2><![CDATA[$2]]></g:id2>'; // 逐行读取、处理并写入 while (($line = fgets($input)) !== false) { fwrite($output, preg_replace($pattern, $replacement, $line)); } fclose($input); fclose($output);
正则片段说明
(<g:id><!\[CDATA\[):捕获原标签的开头部分(转义特殊字符[和!)([^-]+):捕获-之前的所有字符,作为g:id2的核心内容(-[^\]]*)?:可选捕获从-开始到]]前的所有内容(即原ID的后缀部分)(\]\]><\/g:id>):捕获原标签的结尾部分
内容的提问来源于stack exchange,提问作者Ulrik Neerup
相关产品推荐
相关产品推荐

