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
[\"\'](.+?)[\"\']

する必要があります

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

*の代わりに+。最初の式は、前の式が何回出現してもゼロになる可能性があることを意味します (したがって、省略できます。それが必要です)。後者は、少なくとも 1 つ存在する必要があることを意味します。

于 2010-03-28T18:33:48.633 に答える
0

(.+?)表現の真ん中を からに変更したいと思います(.*?)。これにより、少なくとも 1 つの文字に対する非貪欲な一致ではなく、任意の文字 (文字なしを含む) に対する非貪欲な一致になります。

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

ここでの他の答えは、式の途中を変更する必要があるという点で正しいですが、私はそれを [^\"\']* に変更します。貪欲さは想定以上に一致せず、空の "" を許可します。

あなたの表現は
"/([a-z0-9_]+)\s*=\s*[\"\'][^\"\']*[\"\']/is" になります

[a-z0-9_] を [\w_] に変更できることに注意してください。これは大文字にもなります。

于 2010-04-12T04:31:36.620 に答える