我有<key, value>
对的列表,格式为此字符串:
A密钥= valueBAkey = VALUEB ...
因此,例如字符串Ak1=v1BAk2=v2BAk3=v3B
给出以下三对:
k1 = v1
k2 = v2
k3 = v3
我试图在PHP中使用正则表达式减去所有<key, value>
对。
到目前为止我得到的正则表达式如下:
.*A(.+)=(.+)B.*
但这只会抓住最后一对,k3=v3
。
如何捕捉所有事件?
答案 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
匹配所有匹配项而不是最后一个(或第一个)。