正则表达式,多次出现

时间:2011-12-03 18:58:08

标签: php regex

我想知道如何从正则表达式中获得多个出现。

$str = "Some validations <IF TEST>firstValue</IF> in <IF OK>secondValue</IF> end of string.";
$do = preg_match("/<IF(.*)>.*<\/IF>/i", $str, $matches);

这是我到目前为止所做的。如果我只有1,它可以工作,但如果我有更多,它不会返回正确的值。结果如下:

Array ( [0] => firstValue in secondValue [1] => TEST>firstValue in

我需要获得“TEST”和“OK”值。

谢谢!

编辑:我已经提出了修改建议,非常感谢它工作正常!但是,我现在正在尝试添加elsif参数,但无法使其正常工作。这就是我所做的:

$do = preg_match_all("~<IF([^<>]+)>([^<>]+)(</IF>|<ELSEIF([^<>]+)>([^<>]+)</IF>)~", $str, $matches, PREG_SET_ORDER);

,结果是

Array 
( 
    [0] => Array 
           (
              [0] => firstValuesecondValue 
              [1] => TEST 
              [2] => firstValue 
              [3] => secondValue 
              [4] => TEST1 
              [5] => secondValue 
           ) 
    [1] => Array 
           ( 
               [0] => thirdValue 
               [1] => OK 
               [2] => thirdValue 
               [3] => 
           ) 
) 

有没有办法让我的阵列更干净?它有许多像[0] [4]等无用的元素。

再次感谢!

4 个答案:

答案 0 :(得分:2)

你应该使正则表达式更具体。您使用的.*应该不那么贪心,或者更好但不允许使用其他尖括号:

~<IF([^<>]+)>([^<>]+)</IF>~i

更重要的是,您应该使用preg_match_all,而不仅仅是preg_match

preg_match_all("~<IF([^<>]+)>([^<>]+)</IF>~i", $str, $matches, PREG_SET_ORDER);

那会给你一个嵌套数组,如:

[0] => Array
    (
        [0] => <IF TEST>firstValue</IF>
        [1] =>  TEST
        [2] => firstValue
    )

[1] => Array
    (
        [0] => <IF OK>secondValue</IF>
        [1] =>  OK
        [2] => secondValue
    )

答案 1 :(得分:1)

答案指出你应该使用preg_match_all是正确的。

但还有另一个问题:.*默认为greedy。这会导致它匹配单个匹配中的两个标记,因此您需要制作星标non-greedy(即懒惰):

/<IF(.*?)>.*?<\/IF>/i

答案 2 :(得分:1)

使用此代码:

$string = "Some validations <IF TEST>firstValue</IF> in <IF OK>secondValue</IF> end of string.";
$regex = "/<IF (.*?)>.*?<\/IF>/i";
preg_match_all($regex, $string, $matches);
print_r($matches[1]);

你的正则表达式很好但你必须使用非贪婪模式添加?字符并使用preg_match_all()函数。

答案 3 :(得分:0)

为此目的使用非贪婪的匹配.*?preg_match_all