0

エンコードされていないアンパサンドを含むクエリ文字列を (名前を公開したくないひどい支払いシステムから) 受け取りました。

name=joe+jones&company=abercrombie&fitch&other=no

parse_str はこれを処理できません。また、自分のスキームを考え出すのに十分な正規表現を知りません (試してみましたが)。私のハングアップは、私がよく理解していなかった先読み正規表現でした。

私が探しているもの:

Array
(
    [name] => joe jones
    [company] => abercrombie&fitch
    [other] => no
)

アンパサンドごとに文字列をたどることを考えましたが、それはばかげているように思えました。ヘルプ?

4

2 に答える 2

3

これはどう:

2つのアンパサンドが=間にない状態で発生する場合は、最初のアンパサンドをエンコードします。次に、結果を通常のクエリ文字列パーサーに渡します。

それはあなたの仕事を達成するはずです。これが機能するのは、「通常の」クエリ文字列のパターンが常に等号とアンパサンドを交互に繰り返す必要があるためです。したがって、2つのアンパサンドが連続しているということは、そのうちの1つがエンコードされている必要があることを意味し、キーにアンパサンドが含まれていない限り、行の最後のアンパサンドは常に新しいキーの前にある「実際の」アンパサンドです。

次の正規表現を使用してエンコードを実行できるはずです。

$better_qs = preg_replace("/&(?=[^=]*&)/", "%26", $bad_qs);
于 2010-11-03T22:12:40.293 に答える
0

split() 関数を使用して、文字列をアンパサンドで分割することもできます。その後、区切り記号「=」を使用して各要素を再度分割できます...次のようなものです。

$myarray = split("&", $mystring);

foreach ($myarray as $element) {
  $keyvalue = split("=", $element);
  $resultarray[$keyvalue[0]] = $keyvalue[1];
}

print_r($resultarray);

未検証!しかし、あなたはアイデアを得る必要があります。

于 2010-11-03T22:07:49.297 に答える