1

PHP の正規表現について助けが必要です。多くのデータを含む 1 つの文字列があり、その形式は次のようになります。

key=value,e4354ahj\,=awet3,asdfa\=asdfa=23f23

したがって、2 つの区切り文字と = があり、ここで、キーと値のセットです。問題は、キーと値に同じ記号 、および = を含めることができますが、常にエスケープされることです。だから私は爆発を使うことができません。preg_split を使用する必要がありますが、正規表現が苦手です。

誰かこれで手を貸してくれませんか?

4

2 に答える 2

4

負の後読みを使用する必要があります:

// 4 backslashes because they are in a PHP string, so PHP translates them to \\
// and then the regex engine translates the \\ to a literal \
$keyValuePairs = preg_split('/(?<!\\\\),/', $input);

これは、エスケープされていないすべてのもので分割される,ため、キーと値のペアを取得します。キーと値を分離するために、各ペアに対して同じことを行うことができます。

list($key, $value) = preg_split('/(?<!\\\\)=/', $pair);

実際に見てください

于 2013-06-13T09:16:03.083 に答える
1

@ジョンの答えは素晴らしいです。文字列を一致させることで解決策を提供することを考えました:

preg_match_all('#(.*?)(?<!\\\\)=(.*?)(?:(?<!\\\\),|$)#', $string, $m);
// You'll find the keys in $m[1] and the values in $m[2]
$array = array_combine($m[1], $m[2]);
print_r($array);

出力:

Array
(
    [key] => value
    [e4354ahj\,] => awet3
    [asdfa\=asdfa] => 23f23
)

説明:

  • (.*?)(?<!\\\\)==: 何にでもマッチし、前に次の文字がなくなるまでグループ化します。\
  • (.*?)(?:(?<!\\\\),|$),: 何にでも一致し、前\または行末がなくなるまでグループ化します。
于 2013-06-13T09:33:31.177 に答える