preg_match_all用于解析类似xml的属性字符串

时间:2010-03-28 18:27:54

标签: php regex attributes preg-match preg-match-all

我有一个像这样的字符串:

option_alpha="value" option_beta="some other value" option_gamma="X" ...etc.

我正在使用它将它们分解为名称&价值对:

preg_match_all("/([a-z0-9_]+)\s*=\s*[\"\'](.+?)[\"\']/is", $var_string, $matches)

哪个工作正常,除非遇到空属性值:

option_alpha="value" option_beta="" option_gamma="X"

我的正则表达式中我做错了什么?

3 个答案:

答案 0 :(得分:3)

[\"\'](.+?)[\"\']

应该是

[\"\'](.*?)[\"\']

* 而不是+。第一个意味着前一个表达式的出现可以为零(因此可以省略,这就是你需要的)。后者意味着,必须至少有一个

答案 1 :(得分:0)

我认为您希望将表达式的中间位置从(.+?)更改为(.*?)。这使得它成为任何角色(包括没有角色)的非贪婪匹配,而不是至少一个角色的非贪婪匹配。

preg_match_all("/([a-z0-9_]+)\s*=\s*[\"\'](.*?)[\"\']/is",$var_string,$matches);

答案 2 :(得分:0)

这里的其他答案是正确的,你需要更改表达式的中间部分,但我会将其更改为[^ \“\'] *,这意味着”任何不是“的字符,0次或更多次这可以确保贪婪程度与预期不匹配,并允许空“”。

你的表情变成了     “/([A-Z0-9 _] +)\ S * = \ S * [\” \ '] [^ \“\'] * [\ ”\'] /是“

请注意,您可以将[a-z0-9_]更改为[\ w_],这也适用于大写字符。