preg_replace替换捕获组内的符号

时间:2014-05-15 14:04:57

标签: php regex

我有点难过,我需要在引号内包含一些字符,但是我需要将替换文本中的逗号替换为里面的。是否有一个命令?

目前,我这样做:

preg_replace( '[\b([0-9\.,]{16,})]', '="\1"', $chunk );

使用=""围绕长度超过15个符号的数字字符串,但我需要将任何现有的点删除为逗号(Excel兼容性,不要问)。

我知道有两步解决方案,但我有一种感觉我不知道某些PHP / REGEX功能可以更快/更好地完成它。


编辑:最高性能的答案获胜,因为我将处理任意大小的CSV文件,这些文件可能会增长到千兆字节(即使I / O可能是此处的瓶颈)。

1 个答案:

答案 0 :(得分:5)

preg_replace_callback()可让您使用匹配组数组创建回调函数;您返回的值是替换匹配的值。在添加str_replace()="之前,我们可以使用"将所有现有点替换为第二个捕获组的逗号。

preg_replace_callback(
    '[(\b)([0-9\.,]{16,})]',
    function($matches) {
        $value = str_replace('.', ',', $matches[2]);
        return $matches[1] . '="' . $value . '"';
    },
    $chunk
);

两个注释......首先,我会使用其中一个"standard" delimiters/~#)。第二,\b只是将位置作为单词边界匹配..它实际上并不捕获任何数据。因此,您可以替换捕获组以使其更具可读性。最后的表达:

preg_replace_callback(
    '/\b[0-9\.,]{16,}/',
    function($matches) {
        $value = str_replace('.', ',', $matches[0]);
        return '="' . $value . '"';
    },
    $chunk
);