1

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

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

据我所见, split 与 \n 预先匹配可能的 \r 。而且我认为 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 中添加,因为它们有助于澄清我对问题的理解,因此也可能对其他人有用

4

2 回答 2

2

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

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

那么它将与拆分功能相同。

顺便说一句,您使用\r?\nin split 函数并没有进行任何拆分(因为 split 不理解\r并且\n使用单引号)并返回您的原始字符串

编辑:或者,您可以使用双引号正则表达式拆分:

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

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

于 2012-04-23T16:18:22.513 回答
1

split不理解\r\n作为特殊字符,并且因为您使用了单引号 PHP 也不将它们视为特殊字符。split寻找文字\\n或.\r\n

preg_split, 另一方面,确实理解\r\n作为特殊字符,所以即使 PHP 没有像 PCRE 那样对待它们,因此字符串被正确分割。

这与惰性/贪婪匹配无关,这完全是因为单引号没有解析\r\n成它们的换行符含义。

于 2012-04-23T16:21:27.347 回答