如何捕捉所有事件

时间:2011-05-23 21:36:14

标签: php regex

我有<key, value>对的列表,格式为此字符串:

A密钥= valueBAkey = VALUEB ...

因此,例如字符串Ak1=v1BAk2=v2BAk3=v3B给出以下三对:

k1 = v1
k2 = v2
k3 = v3

我试图在PHP中使用正则表达式减去所有<key, value>对。

到目前为止我得到的正则表达式如下:

.*A(.+)=(.+)B.*

但这只会抓住最后一对,k3=v3

如何捕捉所有事件?

4 个答案:

答案 0 :(得分:2)

你确定你没有得到这个吗?

name: k1=v1BAk2=v2BAk3
 key: v3

如果您是,那么您的第一个.+B及其后续所有内容相匹配,直到最后=

我建议使用非贪婪修饰符?

/.*A(.+?)=(.+?)B.*/

另外,请确保您使用的是preg_match_all,而不是preg_match。它的PHP相当于为正则表达式引擎提供/g标志以允许多个匹配。

答案 1 :(得分:1)

使用不同的正则表达式:

if (preg_match_all('/A([^=]+)=([^B]+)B/', 'Ak1=v1BAk2=v2BAk3=v3B', $m) > 0) {
   var_dump($m[1]); // prints keys
   var_dump($m[2]); // prints values

}

输出

array(3) {
  [0]=>
  string(2) "k1"
  [1]=>
  string(2) "k2"
  [2]=>
  string(2) "k3"
}
array(3) {
  [0]=>
  string(2) "v1"
  [1]=>
  string(2) "v2"
  [2]=>
  string(2) "v3"
}

答案 2 :(得分:0)

您需要使用非贪婪模式:A(.+?)=(.+?)B

.+?.*?用于捕获所有字符,直到找到下一个字符。

答案 3 :(得分:0)

另一次更新

这个正则表达式:/A(k\d+=(v\d+))B/将为您提供k=v个匹配项的数组以及仅包含值的数组。

this regex tester上试用。看起来它正在为您提供您想要的结果。这假设“k”,“v”,“A”和“B”是静态的,但您应该能够将其更改为接受动态值。

(事实上,这是一个可以取任何价值的人:/A(.*?=(.*?))B/

更新

实际上,我刚刚注意到你正在使用PHP。

只需使用preg_match_all获取字符串中所有匹配项的数组。

原始

可能使用全局运算符//g

匹配所有匹配项而不是最后一个(或第一个)。