根据段落将文本分解成数组



我有以下文本:

$test = 'Test This is first line
Test:123
This is Test';

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

$array = explode('nn', $test);

知道我在这里错过了什么吗?

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

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

模式解释:

  • (:启动匹配组1
  • rn?|n:匹配rnrn
  • ):结束匹配组1
  • +:重复一次或多次

如果要拆分为2个换行符,请将+替换为{2,}


更新:您可能使用:

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

这个宽泛的回答涵盖了R的含义。请注意,这仅在PCRE/perl中受支持。因此,从某种意义上说,它不太适合交叉口味。

您的代码

$array = explode('nn', $test);

应将nn用双引号括起来:

$array = explode("nn", $test);

使用单引号,它在变量$test中查找文字nn。使用双引号,它查找nn的求值值,这是两个回车。

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

尝试双引号

$array = explode("nn", $test);

你试过这个吗?

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

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

'Paragraph 1nnParagraph 2'=

第1段\n\n第2段

鉴于:

"Paragraph 1nnParagraph 2"=

第1段

第2段

此外,Windows系统使用rnrn而不是nn。您可以检测系统正在使用的线路终点:

PHP_EOL

所以,你的最终代码是:

$paragraphs = explode(PHP_EOL, $text);

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

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';',
  ),
)

还要注意的是,线路馈线是不同的,这取决于环境(与windows的rn相比,*NIX系统的n,或者在某些情况下是简单的r)。也许你可能也想试试explode(PHP_EOL, $text);

最新更新