Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_替换捕获组内的符号_Php_Regex - Fatal编程技术网

Php preg_替换捕获组内的符号

Php preg_替换捕获组内的符号,php,regex,Php,Regex,我有点困惑,我需要在引号中包含一些字符,但我需要在替换的文本中将逗号替换为点。有一个单一的命令吗 目前,我正在这样做: preg_replace( '[\b([0-9\.,]{16,})]', '="\1"', $chunk ); 它用=“和”包围长度超过15个符号的数字字符串,但我需要将任何现有点转换为逗号(Excel兼容性,不问) 我知道有两步解决方案,但我觉得我不知道一些PHP/REGEX特性可以更快/更好地完成 编辑:性能最好的答案获胜,因为我将处理任意大小的CSV文件,这些文件可能

我有点困惑,我需要在引号中包含一些字符,但我需要在替换的文本中将逗号替换为点。有一个单一的命令吗

目前,我正在这样做:

preg_replace( '[\b([0-9\.,]{16,})]', '="\1"', $chunk );
它用
=“
包围长度超过15个符号的数字字符串,但我需要将任何现有点转换为逗号(Excel兼容性,不问)

我知道有两步解决方案,但我觉得我不知道一些PHP/REGEX特性可以更快/更好地完成


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

允许您使用匹配组数组创建回调函数;返回的值将替换匹配项。我们可以使用
str_replace()
将第二个捕获组的所有现有点替换为逗号,然后再添加
=“

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

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

preg\u replace\u callback
。可以将数组作为
preg\u replace
的第一个和第二个参数传递。因此,您当前的参数将是其各自数组中的第一项,然后在每个数组中为点添加一项以替换逗号。伙计们,谢谢,为什么这些答案不存在?我没有说在中找不到的任何内容,所以将其作为一个答案感觉不太正确。此外,我还试图编写一个工作示例,但我无法让您发布的代码按照您所说的方式工作。谢谢,我根据@Sam的建议调整了代码,该片段现在是我目前在生产中使用的,没有最后一分钟的修复。无论如何,数组是不够的,因为它是一个两步解决方案,它需要搜索两次数字-一次替换逗号,然后包装它们,这将使复杂性增加两倍…感谢第二个注意事项,我刚刚替换了该部分,认为这是一个bug,并惊讶地发现它到目前为止似乎仍能正常工作如果您正在寻找性能,则有可能(取决于您的CSV文件)您可以使用并逐行读取该文件。这将大大减少您的内存占用。是的,我正在按照这些思路做一些事情,尽管CSV源不是一个文件,但那是无关紧要的,不管怎样,我还是同意你的解决方案,非常感谢!至于正则表达式分隔符,我发现当正则表达式本身不包含它们时,方括号更容易阅读,在这个例子中,它包含了,所以是的,我正在更改它。公平地说,它只是非典型的,所以我想我会提出来。感谢您的回复:)
preg_replace_callback(
    '/\b[0-9\.,]{16,}/',
    function($matches) {
        $value = str_replace('.', ',', $matches[0]);
        return '="' . $value . '"';
    },
    $chunk
);