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