TL;DR (その値、文字列ですか?)
「%5B0%5D」は文字列「[0]」を URL エンコードしたもの
PHP のhttp_build_query
関数を使う際、第1引数に渡す配列に注意する必要があります。
というのも、配列の値(value)が文字列以外の場合はキー名に「[n]」が付加されるからです。
パターン1
/* パターン1 */
$params = http_build_query([
'hoge' => ['fuga'],
]);
echo $params . PHP_EOL;
echo urldecode($params) . PHP_EOL;
// 出力結果('hoge'のキー名に"%5B0%5D"が付いてしまう)
//
// hoge%5B0%5D=fuga
// hoge[0]=fuga
パターン2
/* パターン2 */
$params = http_build_query([
'foo' => 'bar',
'hoge' => ['huga', 'piyo']
]);
echo $params . PHP_EOL;
echo urldecode($params) . PHP_EOL;
// 出力結果('hoge'のキーに"%5B?%5D"が付くが'foo'のキーには付かない)
//
// foo=bar&hoge%5B0%5D=huga&hoge%5B1%5D=piyo
// foo=bar&hoge[0]=huga&hoge[1]=piyo
/* 受け手(POST/GET先)の仕様上どうしても消したい場合は置き換える(削除する) */
$params = preg_replace('/%5B(\d+?)%5D/', '', $params);
echo $params . PHP_EOL;
// 出力結果
//foo=bar&hoge=huga&hoge=piyo
所感
実家の WiFi ルーターが、WiFi カメラを設置してから調子が悪く(同じカメラのセッションが大量に残ってしまうため)定期的な再起動が必要になりました。
病院提出用にトイレの回数を取るために使っていたラズパイ3と AmazonDashButton(ADB) があったので、ADB でルータを再起動させたいと思いました。しかし、curl
で叩くと正常に再起動するのに、PHP で書いた CLI スクリプトが動かない。
出力した内容(POST する内容)をよくよく見ると「%5B0%5D」という見慣れない文字列が入っていました。
どうやらルータを再起動するために必要なセッション ID を取得する為に使った DOMDocument()
で XML(リブートのページ)から抜き出したフォームの value
属性値がオブジェクトのままだったようです。アチョンブリケ。
参考文献
- "PHP:http_build_query | manual @ PHP.net
- "Strip http_build_query string of %5B and %5D" @ reddit.com