按换行符分割字符串[重复]

问题描述 投票:0回答:2

这个问题与 使用 preg_split 而不是 split 非常相似,但我对正则表达式有一些困惑,我会尽力澄清。

尝试更新一些现有的

split()
函数以使用
preg_split()
代替,但我得到了一些不清楚的结果。运行下面的代码会给我不同长度的数组,我不知道为什么。

据我所知,拆分正在匹配 与一个可能的 预先。 我认为

preg_split()
也在做同样的事情,但是为什么它会创建 2 个分割呢?这与惰性/贪婪匹配有关吗?

演示代码:

$test = "\r\n";

$val = split('\r?\n', $test); //literal interpretation of string
$val_new = split("\r?\n", $test); //php understanding that these are EOL chars
$val2 = preg_split('/\r?\n/', $test);

var_dump($val); // returns array(1) { [0]=> string(2) " " }
var_dump($val2); // returns array(2) { [0]=> string(0) "" [1]=> string(0) "" }

编辑:根据 Kolinks 评论添加到 $val_new 中,因为它们帮助澄清了我对问题的理解,因此可能对其他人也有用

php regex preg-split
2个回答
2
投票

您应该将

PREG_SPLIT_NO_EMPTY
标记为
preg_split
的第三个参数,以忽略拆分数组中的空标记。所以如果你使用

preg_split('/\r?\n/', $test, PREG_SPLIT_NO_EMPTY);

然后它的行为与 split 函数相同。

顺便说一下,您在 split 函数中使用

\r?\n
并没有进行任何拆分(因为 split 不理解单引号中的
\r
\n
)并返回您的 原始字符串

编辑: 或者,您可以使用带双引号正则表达式的 split :

split("\r?\n", $test);

将字符串拆分为 2 个元素数组。


1
投票

split
不将
\r
\n
理解为特殊字符,并且由于您使用单引号,PHP 也不将它们视为特殊字符。所以
split
正在寻找文字
\\n
\r\n

另一方面,

preg_split
确实将
\r
\n
理解为特殊字符,因此即使 PHP 不像 PCRE 那样对待它们,因此字符串也会被正确分割。

这与惰性/贪婪匹配无关,这都是因为单引号没有将

\r\n
解析为换行符含义。

© www.soinside.com 2019 - 2024. All rights reserved.