1

我有一个这样的字符串:

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"

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

4

3 回答 3

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

应该

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

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

于 2010-03-28T18:33:48.633 回答
0

我认为您想将表达式的中间部分从 更改(.+?)(.*?)。这使它成为对任何字符(包括无字符)的非贪婪匹配,而不是对至少一个字符的非贪婪匹配。

preg_match_all("/([a-z0-9_]+)\s*=\s*[\"\'](.*?)[\"\']/is",$var_string,$matches);
于 2010-03-28T18:34:06.990 回答
0

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

你的表达式变成
"/([a-z0-9_]+)\s*=\s*[\"\'][^\"\']*[\"\']/is"

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

于 2010-04-12T04:31:36.620 回答