2010-03-28 261 views
1

我有像這樣的字符串:preg_match_all解析XML類屬性字符串

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

我想你想改變你的表達的中間從(.+?)(.*?)。這使得它對任何角色(包括沒有字符)都是非貪婪的匹配,而不是至少一個角色的非貪婪匹配。

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

這裏其他的答案是正確的,你需要改變表達式的中間,但我想將其更改爲[^ \「\'] *,這意味着‘不是任何字符’, 0或更多次,這確保了貪婪不匹配超過它應該允許的空「」。

您的表情變成
「/([a-z0-9 _] +)\ s * = \ s * [\'\'] * [\「\'] /是」

請注意,您可以將[a-z0-9_]更改爲[\ w_]也適用於大寫字母。