Php 在新行拆分字符串,除非在引号中有新行

Php 在新行拆分字符串,除非在引号中有新行,php,split,Php,Split,除非新行在引号内,否则可以在新行拆分字符串吗 $string = 'aa\nbb\n"cc\ndd"'; $arr = explode("\n", $string); //$arr = array('aa','bb','"cc','dd"'); 我想: $arr = array('aa','bb','cc\ndd'); 在您的示例中,“…\n…”并不像axiac指出的那样是新行。PHP中的换行符更容易用双引号表示,因此PHP将它们解释为换行符。也许你的意思是: $string = "aa\n

除非新行在引号内,否则可以在新行拆分字符串吗

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

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

在您的示例中,“…\n…”并不像axiac指出的那样是新行。PHP中的换行符更容易用双引号表示,因此PHP将它们解释为换行符。也许你的意思是:

$string = "aa\nbb\n\"cc\ndd\"";
如果是这种情况,您可以像这样创建一个正则表达式样式拆分,它应该捕获所有不在引号之间的换行:

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

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

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

您可以通过使用
(*SKIP)(*FAIL)
使用并取消引用的子字符串,拆分没有用双引号括起来的换行符,然后在换行符上分解

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

代码:()


撇号中的
\n
不是新行。它是一个(未正确转义)反斜杠,后跟
n
。因为这种组合在用撇号括起来的字符串中没有特殊意义,所以PHP会逐字解释它(即反斜杠后跟
n
)。
$text = <<<TEXT
aa\nbb\n"cc\ndd"
TEXT;

var_export(preg_split('~"[^"]*"(*SKIP)(*FAIL)|\n~', $text));
array (
  0 => 'aa',
  1 => 'bb',
  2 => '"cc
dd"',
)