【问题标题】:Preg_split captured all result in arrayPreg_split 在数组中捕获所有结果
【发布时间】:2012-03-04 23:40:33
【问题描述】:

我对 php 中的函数 preg_split 有问题

我的正则表达式是

#^(-?[0-9]+)(([+x])(-?[0-9]+))*$#

我想要例如变换:

-5+69x45

在这样的数组中

{
[0] = -5
[1] = +
[2] = 69
[3] = x
[4] = 45
}

我的正则表达式工作和 preg_match 数学

但是使用 preg split 我没有我的数组

我有一个没有标志的空数组或

{
[0] = -5
[1] = x
[2] = 45
}

带有标志 PREG_SPLIT_DELIM_CAPTURE

我的错误在哪里?

【问题讨论】:

    标签: php regex delimiter preg-split


    【解决方案1】:

    我认为你误解了preg_split

    您定义的模式用于拆分字符串,但这意味着与您的模式匹配的字符串部分不包含在结果数组中。

    通过使用标志PREG_SPLIT_DELIM_CAPTURE 将捕获组的内容添加到结果数组 (preg_spit doc)。

    #^(-?[0-9]+)(([+x])(-?[0-9]+))*$#
                ^^^^^^^^^^^^^^^^^^
    

    但是您在最后两个组周围有一个量词,这意味着在 $2 和 $3 中只是存储的最后一个匹配项,并且该组的第一个匹配项“+69”被覆盖,所以在你的情况下你得到

    $1 = -5
    $2 = x
    $3 = 45
    

    【讨论】:

    • 是的,但是如果我在 preg_split 中使用像 #[+x]# 这样的简单正则表达式,我有很好的数字,但没有分隔符。我不想要两者。
    • @Jebik 然后只需在#([+x])# 周围加上括号并使用标志PREG_SPLIT_DELIM_CAPTURE 将这些匹配项添加到结果数组中,这应该会给你你想要的。
    • 还有一件事我是新手,我不知道如何结束一个问题。如何将此问题标记为已解决?
    • @Jebik 不客气,见How does accepting an answer work?
    【解决方案2】:

    您可以使用此代码:

    $str = '-5+69x45';
    $arr = 
     preg_split('#([+x]|-?\d+)#', $str, 0, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY );
    print_r($arr);
    

    输出:

    Array
    (
        [0] => -5
        [1] => +
        [2] => 69
        [3] => x
        [4] => 45
    )
    

    【讨论】:

      猜你喜欢
      • 2013-09-13
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多