2

我有以下文字:

$test = 'Test This is first line

Test:123

This is Test';

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

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

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

4

6 回答 6

7

您可能在使用\r\n而不是\n. 您可以使用正则表达式使其具有通用性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);

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

于 2013-07-16T09:53:18.717 回答
3

你的代码

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

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

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

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

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

于 2013-07-16T09:53:54.670 回答
2

试试双引号

$array = explode("\n\n", $test);
于 2013-07-16T09:54:05.050 回答
1

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

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\nwindows 相比,或者在某些情况下是简单的\r)。explode(PHP_EOL, $text);也许你也想试试

于 2013-07-16T10:03:30.537 回答
0

你试过这个吗?

$array = explode("\n", $test);
于 2013-07-16T09:57:06.063 回答
0

您需要在代码中使用双引号,以便\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);
于 2017-11-02T07:51:04.117 回答