我有些困惑,我需要在引号内包装一些字符,但需要在替换的文本内将逗号替换为点。有一个命令吗?
目前,我正在这样做:
preg_replace( '[\b([0-9\.,]{16,})]', '="\1"', $chunk );
Run Code Online (Sandbox Code Playgroud)
它使用="和将长度超过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
);
Run Code Online (Sandbox Code Playgroud)
二notes..first,我会用一个“标准”分隔符(/,~,#)。其次,\b仅将位置匹配为单词边界。它实际上不捕获任何数据。因此,您可以替换捕获组以使其更具可读性。最终表达:
preg_replace_callback(
'/\b[0-9\.,]{16,}/',
function($matches) {
$value = str_replace('.', ',', $matches[0]);
return '="' . $value . '"';
},
$chunk
);
Run Code Online (Sandbox Code Playgroud)