这个问题与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中添加,因为它们有助于清除我对问题的理解,因此也可能对其他人有用
答案 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
解析为其换行符含义。