这个问题在这里已有答案:
我试图找到一个正则表达式,它将匹配CSV文件中双引号分隔字符串之间的任何换行符。
我能够使用这个正则表达式来识别引号之间的字符串:(["])(?:\\.|[^\\])*?\1
我可以使用这个正则表达式识别换行符:(\r\n|\r|\n)
但我不确定如何“结合”两者来获得我需要的表达。
表达式应仅匹配双引号之间存在的换行符。
作为@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的字符串中添加额外的\ ...