正则表达式删除CSV文件中引号之间出现的任何换行符[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

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

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

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

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

php regex csv
1个回答
1
投票

作为@fyroc suggested,将两个正则表达式分开组合,如下所示:

<?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的字符串中添加额外的\ ...

© www.soinside.com 2019 - 2024. All rights reserved.