我有点难过,我需要将一些字符括在引号内,但我需要将逗号替换为点 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/