【问题标题】:Split string in at new line, unless new line in quotes在新行拆分字符串,除非引号中的新行
【发布时间】:2014-12-23 16:11:04
【问题描述】:

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

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

我想要:

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

【问题讨论】:

  • 撇号中的 \n 不是新行。这是一个(未正确转义)反斜杠,后跟一个n。因为这种组合在用撇号括起来的字符串中使用时没有特殊含义,PHP 将按字面意思解释它(即反斜杠后跟 n)。

标签: php split


【解决方案1】:

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

您可以使用(*SKIP)(*FAIL) 来拆分未包含在双引号中的换行符,以消耗和取消引用的子字符串,然后在换行符处爆炸。

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

代码:(Demo)

$text = <<<TEXT
aa\nbb\n"cc\ndd"
TEXT;

var_export(preg_split('~"[^"]*"(*SKIP)(*FAIL)|\n~', $text));

输出:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-11-27
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 2016-03-13
      • 2022-11-26
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      相关资源
      最近更新 更多