我有一个像这样的字符串:
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"
我的正则表达式中我做错了什么?
答案 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_],这也适用于大写字符。