【问题标题】:PHP preg_split result not correctPHP preg_split 结果不正确
【发布时间】:2012-10-19 04:30:18
【问题描述】:

我正在尝试在 PHP 中学习正则表达式并使用 preg_split 函数。

这似乎不正确,或者我的理解完全错误。

我使用的测试代码是:

$string = "test ing ";
var_dump(preg_split('/t/', $string));

我希望得到一个如下所示的数组:

[0] => "es" [1] => " ing "

但正在返回以下内容:

[0] => "" [1] => "es" [2] => " ing "

为什么开头有一个空字符串?

我知道我可以使用PREG_SPLIT_NO_EMPTY 标志来过滤它,但它不应该一开始就在那里。应该吗?

【问题讨论】:

    标签: php regex preg-split


    【解决方案1】:

    为什么不应该呢?这正是它的工作原理。 split 操作的语义是你有一个这种格式的字符串:

    value-delimiter-value-delimiter-value-...-delimiter-value
    

    (注意它是以一个值开始和结束,而不是一个分隔符。)

    因此,如果您的字符串以定界符开头,那么假设在该定界符之前有一个空值是绝对有效的(因为定界符应该将某些东西拆分一分为二)。您通常也不想拒绝两个连续的ts 之间的空字符串,对吗?

    这正是PREG_SPLIT_NO_EMPTY 的用途。每当您确实想要摆脱那些空字符串时,都可以使用它。

    作为一个简单的例子,为什么你会想要默认行为,想想 CSV 文件。您想在(例如); 处拆分一行。您通常还希望允许空值。现在,如果您的第一列中的值为空(这意味着该行将以;开始,并且您将第一个空字符串完全切掉,那么结果数组中的所有索引突然将对应于不同的列。这就是为什么您也希望保留这些空字符串的原因。在许多情况下,您知道有多少分隔符,因此知道有多少值 - 并且您希望能够识别哪个值属于哪个位置。即使有些其中一个是空的。

    【讨论】:

    • 好的,这就是我的理解有缺陷的地方。它分裂并在分裂点后面看。
    【解决方案2】:

    100% 正确。第一个字符是't',所以它首先在那个't'上分裂。在第一个 't' 之前没有任何内容,因此数组结果以一个空字符串条目开始。

    【讨论】:

      【解决方案3】:

      这是因为您的字符串开头的t。如果您不使用PREG_SPLIT_NO_EMPTY 选项,preg_split 会将空字符串视为有效拆分。

      这样想:preg_split 在任何地方都看到t,它将字符串分成两个块:t 之前的块和它之后的块。即使其中一个块中没有任何内容,它仍然很重要。那段只是一个空字符串。

      对于某些应用程序,这将非常有用 - 例如,假设您想用某些东西替换每个 t,但替换太复杂而无法仅使用 preg_replace。该语言希望您能够选择,因此除非您明确告诉它不要使用 PREG_SPLIT_NO_EMPTY,否则它会保留空拆分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        • 2016-05-15
        • 1970-01-01
        相关资源
        最近更新 更多