我想知道如何从正则表达式中获得多个出现。
$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]等无用的元素。
再次感谢!
答案 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
。