【问题标题】:split to preg_split拆分为 preg_split
【发布时间】:2012-04-23 16:14:03
【问题描述】:

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

【问题讨论】:

    标签: php regex preg-split


    【解决方案1】:

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

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

    那么它的行为将与拆分功能相同。

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

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

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

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

    【讨论】:

    • 正在进行一些编辑,请立即检查以获得更好的解释。
    • 还是错了,尤其是split()被明确定义为“将字符串拆分成数组通过正则表达式
    • 啊,是的,您是对的,现在进行更正。谢谢指点。
    • 谢谢,这确实使它匹配相同,让我去阅读它
    【解决方案2】:

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

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

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

    【讨论】:

    • 啊哈,现在说得很有道理,也帮助我解决了我的问题。非常感谢您的明确解释 - 只要我允许,就会将此标记为答案
    猜你喜欢
    • 2011-06-11
    • 2019-05-14
    • 2019-07-07
    • 1970-01-01
    • 2013-04-30
    • 2013-10-05
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多