【问题标题】:Explode text into array as per paragraph根据段落将文本分解为数组
【发布时间】:2013-07-14 10:40:52
【问题描述】:

我有以下文字:

$test = 'Test This is first line

Test:123

This is Test';

我想把这个字符串分解成一个段落数组。我写了以下代码,但它不起作用:

$array = explode('\n\n', $test);

知道我在这里缺少什么吗?

【问题讨论】:

  • 你试过\r\n或者PHP_EOL常量吗?
  • 它是否适用于 $test = 'Test This is first line\n\nTest:123\n\nThis is Test'; ?我不确定这一点,但也许您需要在将字符串定义为变量时明确包含换行符。

标签: php arrays explode


【解决方案1】:

您可能在使用\r\n 而不是\n 的Windows 上。您可以使用正则表达式使其与preg_split() 通用:

$array = preg_split('#(\r\n?|\n)+#', $test);

模式说明:

  • ( : 开始匹配组 1
  • \r\n?|\n :匹配 \r\n\r\n
  • ) : 结束匹配组 1
  • + :重复一次或多次

如果您想用 2 个换行符分割,请将 + 替换为 {2,}


更新:您可能会使用:

$array = preg_split('#\R+#', $test);

This extensive answer 涵盖了\R 的含义。请注意,这仅在 PCRE/perl 中受支持。所以从某种意义上说,它不太兼容交叉口味。

【讨论】:

  • preg_match_all('/.+/',$test, $test) 恕我直言仍然容易得多,并且可以满足 OP 的要求
  • @EliasVanOotegem 好吧,既然你这么说......我专注于“拆分”的想法:p 如果我们想拆分 2 个换行符或加号,拆分解决方案有更多控制权:)
  • 公平点。由于 OP 将段落指定为分隔符,我不得不说你的方法是要采用的方法
【解决方案2】:

你的代码

$array = explode('\n\n', $test);

应该用双引号将\n\n 括起来:

$array = explode("\n\n", $test);

使用单引号,它通过变量$test 查找文字\n\n。使用双引号,它会查找 \n\n 的评估值,即两个回车符。

另外,请注意行尾取决于主机操作系统。 Windows 使用\r\n 而不是\n。您可以使用预定义的常量PHP_EOL 获取操作系统的行尾。

【讨论】:

    【解决方案3】:

    试试双引号

    $array = explode("\n\n", $test);
    

    【讨论】:

      【解决方案4】:

      将此文本放入您描述的数组中的最简单方法是:

      preg_match_all('/.+/',$string, $array);
      

      由于/./ 匹配除行终止符之外的任何字符,并且+ 是贪心的,它会匹配尽可能多的字符,直到遇到换行符。
      使用preg_match_all 可确保对每一行也重复此操作。当我尝试这个时,输出看起来像这样:

      array (
        0 => 
        array (
          0 => '$test = \'Test This is first line',
          1 => 'Test:123',
          2 => 'This is Test\';',
        ),
      )
      

      另请注意,换行符因环境而异(\n 用于 *NIX 系统,\r\n 用于 Windows,或者在某些情况下为简单的\r)。或许你也想试试explode(PHP_EOL, $text);

      【讨论】:

        【解决方案5】:

        你试过了吗?

        $array = explode("\n", $test);
        

        【讨论】:

        • 这会在换行符上分割,而不是段落。
        【解决方案6】:

        您需要在代码中使用双引号,这样\n\n 实际上会被计算为两行。往下看:

        'Paragraph 1\n\nParagraph 2' =

        第 1 段\n\n第 2 段

        鉴于:

        "Paragraph 1\n\nParagraph 2" =

        第 1 段

        第 2 段

        另外,Windows 系统使用\r\n\r\n 而不是\n\n。您可以检测系统正在使用哪些行尾:

        PHP_EOL
        

        所以,你的最终代码是:

        $paragraphs = explode(PHP_EOL, $text);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-05
          • 1970-01-01
          • 2023-03-13
          • 2022-10-15
          • 2015-07-10
          相关资源
          最近更新 更多