在新行拆分字符串,除非在引号中插入新行


Split string in at new line, unless new line in quotes

>我可以在新行拆分字符串吗,除非新行在引号内?

$string = 'aa'nbb'n"cc'ndd"';
$arr = explode("'n", $string);
//$arr = array('aa','bb','"cc','dd"');

我想要:

$arr = array('aa','bb','cc'ndd');

根据您的explode()调用,我将假设您在发布示例输入时犯了错误,并且您的实际输入生成了您提供的示例输出。

您可以使用 (*SKIP)(*FAIL) 来拆分未用双引号括起来的换行符,以使用和取消带引号的子字符串,然后只需在换行符上爆炸。

诚然,如果您的文本可能包含转义的双引号字符,这将不可靠 - 因为该模式会将转义的引号视为未转义的引号。

代码:(演示)

$text = <<<TEXT
aa'nbb'n"cc'ndd"
TEXT;
var_export(preg_split('~"[^"]*"(*SKIP)(*FAIL)|'n~', $text));

输出:

array (
  0 => 'aa',
  1 => 'bb',
  2 => '"cc
dd"',
)

在您的示例中,正如 axiac 指出的那样,"...'..."不是换行符。 PHP 中的换行符更容易用双引号表示,因此 PHP 将它们解释为换行符。 也许你的意思是:

$string = "aa'nbb'n'"cc'ndd'"";

如果是这种情况,您可以像这样创建一个正则表达式样式的拆分,它应该捕获所有不在引号之间的换行符:

$arr = preg_split("/('n)(?=(?:[^'"]|'"[^'"]*'")*$)/m", $string);

请注意多行标志 (m),因为您正在处理换行符。