2012-04-23 58 views
1

这个问题与use preg_split instead of split非常相似,但我对我正在清除的正则表达式有一些疑惑。分裂为preg_split

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

从我可以看到split \ n匹配\ 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因为他们帮助清理我对问题的理解,可能是使用的另一个太

回答

1

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

preg_split,而另一方面,也明白\r\n特殊字符,所以尽管这样做PCRE,因此字符串正确分割PHP不善待他们。

这与惰性/贪婪匹配没有任何关系,这都是因为单引号没有将\r\n解析为它们的换行符意义。

+0

啊哈,这是现在完美的意义,并帮助我解决了我的问题。非常感谢您的明确解释 - 只要我允许,将其标记为答案 – 2012-04-23 16:29:05

2

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

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

那么它将表现与分裂功能相同。

,并由您在分割功能使用\r?\n没有做任何分裂(因为拆分不理解在单引号\r\n)并返回你的原始字符串回来的路上。

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

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

你的字符串分割成2个元素的数组。

+0

不是什么被问到... – 2012-04-23 16:21:39

+0

这是在一些编辑中,请检查它现在更好的解释。 – anubhava 2012-04-23 16:22:27

+0

仍然错误,特别是因为['split()'](http://php.net/split)被明确定义为“通过正则表达式将字符串拆分成***” – 2012-04-23 16:23:13