首页 > 解决方案 > 正则表达式删除 CSV 文件中引号之间出现的任何换行符

问题描述

我试图找到一个正则表达式,它将匹配 CSV 文件中双引号分隔的字符串之间的任何换行符。

我能够使用此正则表达式识别引号之间的字符串: (["])(?:\\.|[^\\])*?\1

我可以使用这个正则表达式来识别换行符: (\r\n|\r|\n)

但我不确定如何将两者“结合”以获得我需要的表达。

该表达式应仅匹配双引号之间存在的换行符。

标签: phpregexcsv

解决方案


正如@fyroc 建议的那样,分别组合这两个正则表达式,如下所示:

<?php
$testString = <<<EOF
a,b,c,d,"test
test2
test3",zzz
zz,yy,vv,"a
b
"
uuu,ttt,"xyz",zzz
aaa,bbb,ccc
ddd,"","a","zz"
xyz,abc,"a
b
c
"
"
a,c,d,"
dadasda"
EOF;

function remove_eol($matches) {
    //var_dump($matches);
    return preg_replace('/\R/', '', $matches[0]);
}

$testStringWithoutEnclosedEol = preg_replace_callback('/(["])(?:\\\\.|[^\\\\])*?\1/', 'remove_eol', $testString);

?>
<?php var_dump($testStringWithoutEnclosedEol); ?>

记下我更改了这个正则表达式

(\r\n|\r|\n)

简单来说

\R
line break: matches \n, \r and \r\n

https://www.php.net/manual/en/regexp.reference.escape.php

而且我必须在传递给 preg_replace_callback 的字符串中添加额外的 \...


推荐阅读