php - preg_replace 替换捕获组内的符号

标签 php regex

我有点难过,我需要将一些字符括在引号内,但我需要将逗号替换为点 inside 被替换的文本。有一个命令吗?

目前,我正在这样做:

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

="" 包围超过 15 个符号的数字字符串,但我需要将任何现有的点转换为逗号(Excel 兼容性,不要问) .

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


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

最佳答案

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
);

关于php - preg_replace 替换捕获组内的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23680610/

相关文章:

JavaScript:正则表达式将此 "2018Jun12-2018Jul11"日期字符串替换为此 "Jun 12, 2018 - Jul 11, 2018"日期字符串

php - 如何使用 HTML 和 jQuery 进行表单验证而不重定向到另一个页面?

PHP 清理数据

MySQL 查询中的 PHP 变量

python - 邮件 URL 中的正则表达式匹配密码

java - 正则表达式优化 - 在 Java 中转义&符号

c# - 正则表达式排除非单词字符但保留空格

JavaScript 基础是 math.pow 函数中的十进制数

php - 是不是所有的数据库都使用USE语句来切换数据库?

php - 在 PHP 中返回基于开始和结束时间的时间段数组