这个问题与使用preg_split而不是拆分非常相似,但我对正则表达式有一些混淆,我会活着清理。
尝试更新一些现有的 split() 函数以使用 preg_split() 代替,我得到了一些不清楚的结果。运行下面的代码会给我不同长度的数组,我不确定为什么。
从我所看到的,拆分是在 上与可能的 \r 事先匹配。我认为preg_split也在做同样的事情,但为什么要创建 2 个拆分?这与懒惰/贪婪匹配有关吗?
演示代码 :
$test = "rn";
$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中,因为它们有助于澄清我对问题的理解,因此可能对其他人也有用
您应该PREG_SPLIT_NO_EMPTY
标志作为preg_split
的第三个参数,以忽略拆分数组中的空标记。所以如果你使用
preg_split('/r?n/', $test, PREG_SPLIT_NO_EMPTY);
然后它的行为将与拆分功能相同。
顺便说一下,您在拆分函数中使用r?n
是不进行任何拆分(因为 split 不理解r
并在单引号中n
)并返回原始字符串。
编辑:或者,您可以使用双引号拆分正则表达式:
split("r?n", $test);
将字符串拆分为 2 个元素数组。
split
不理解r
和n
是特殊字符,并且由于您使用单引号,PHP 也不会将它们视为特殊字符。所以split
正在寻找字面上的\n
或rn
.
另一方面,preg_split
确实将r
和n
理解为特殊字符,因此即使PHP没有像PCRE那样对待它们,因此字符串被正确拆分。
这与懒惰/贪婪匹配无关,这都是因为单引号没有将rn
解析为换行符的含义。