我有以下文字:
$test = 'Test This is first line
Test:123
This is Test';
我想把这个字符串分解成一个段落数组。我写了以下代码,但它不起作用:
$array = explode('\n\n', $test);
知道我在这里缺少什么吗?
您可能在使用\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 中受支持。所以从某种意义上说,它不太兼容交叉口味。
你的代码
$array = explode('\n\n', $test);
应该\n\n
用双引号括起来:
$array = explode("\n\n", $test);
使用单引号,它在变量$test
中查找文字\n\n
。使用双引号,它会查找\n\n
两个回车符的评估值。
另外,请注意行尾取决于主机操作系统。Windows 使用\r\n
而不是\n
. 您可以使用预定义的常量来获取操作系统的行尾PHP_EOL
。
试试双引号
$array = explode("\n\n", $test);
将此文本放入您描述的数组中的最简单方法是:
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);
也许你也想试试
你试过这个吗?
$array = explode("\n", $test);
您需要在代码中使用双引号,以便\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);