拆分为preg_split

时间:2012-04-23 16:14:04

标签: php regex preg-split

这个问题与use preg_split instead of 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中添加,因为它们有助于清除我对问题的理解,因此也可能对其他人有用

2 个答案:

答案 0 :(得分:2)

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

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

然后它的行为与分割功能相同。

顺便说一下,在分割函数中使用\r?\n时没有进行任何拆分(因为拆分不能理解单引号中的\r\n)并返回原始字符串返回。

编辑:或者你可以使用双引号regex分割:

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

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

答案 1 :(得分:1)

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

另一方面,

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

这与懒惰/贪婪匹配无关,所有这些都是因为单引号未将\r\n解析为其换行符含义。