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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:00:26