<value> 文字列が一重引用符または二重引用符で囲まれているかどうかに関係なく、keyword='value' ペアを解析する正規表現 (PHP の preg_match() に適しています) を書くのに問題があります。次の両方のケースで IOW <name> と <value> を取得する必要があります。ここで、<value> 文字列には囲んでいないタイプの引用符が含まれている可能性があります。
name="value"
name='value'
<value> 文字列が一重引用符または二重引用符で囲まれているかどうかに関係なく、keyword='value' ペアを解析する正規表現 (PHP の preg_match() に適しています) を書くのに問題があります。次の両方のケースで IOW <name> と <value> を取得する必要があります。ここで、<value> 文字列には囲んでいないタイプの引用符が含まれている可能性があります。
name="value"
name='value'
Perl では、これは機能する正規表現です。最初に行頭に一致し、次に 1 つ以上の = 以外の文字に一致し、それらを $1 に設定します。次に、= を探し、" または ' に一致するかどうかを選択して非括弧を探し、それを $2 に設定します。
/^([^=]+)=(?:"([^"]+)"|'([^']+)')$/
のような空白の式と一致させたい場合。
これは=""
最後の 2 つの + を * に置き換えます。
コメントで述べたように編集します。ダグが使った...
/^\s?([^=]+)\s?=\s?("([^"]+)"|\'([^\']+)\')\s?/
これは、入力または値の一方の端にある 1 つのオプションの空白と一致し、行末マーカーを削除しました。
/^(\w+?)=(['"])(\w+?)\2$/
キーを$1
に、値を に配置し$3
ます。
数年遅れましたが、この質問は Google で上位にランクされており、回答が私のニーズを満たしていないため、別の表現を次に示します。
(?<key>\w+)\s*=\s*(['"]?)(?<val>(?:(?!\2)[^\\]|\\.|\w)+)\2
これは、エスケープされた引用符と引用符で囲まれていない値を考慮して、一重引用符または二重引用符に一致します。
name = bar
name = "bar"
name = 'bar'
name = "\"ba\"r\""
ただし、値が欠落している場合、次のキーと値のペアからキーが読み取られるという制限があります。これは、キーと値のペアのカンマ区切りのリストを使用して対処できます。