split to preg_split



这个问题与使用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不理解rn是特殊字符,并且由于您使用单引号,PHP 也不会将它们视为特殊字符。所以split正在寻找字面上的\nrn.

另一方面,preg_split确实将rn理解为特殊字符,因此即使PHP没有像PCRE那样对待它们,因此字符串被正确拆分。

这与懒惰/贪婪匹配无关,这都是因为单引号没有将rn解析为换行符的含义。

相关内容

  • 没有找到相关文章

最新更新