我有点难过,我需要在引号内包含一些字符,但是我需要将替换文本中的逗号替换为里面的。是否有一个命令?
目前,我这样做:
preg_replace( '[\b([0-9\.,]{16,})]', '="\1"', $chunk );
使用="
和"
围绕长度超过15个符号的数字字符串,但我需要将任何现有的点删除为逗号(Excel兼容性,不要问)。
我知道有两步解决方案,但我有一种感觉我不知道某些PHP / REGEX功能可以更快/更好地完成它。
编辑:最高性能的答案获胜,因为我将处理任意大小的CSV文件,这些文件可能会增长到千兆字节(即使I / O可能是此处的瓶颈)。
答案 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
);