json_encode()がスラッシュをエスケープする


164

InstagramからJSONを取得しています。

$instagrams = json_decode($response)->data;

次に、変数をPHP配列に解析してデータを再構築し、ファイルを再エンコードしてキャッシュします。

file_put_contents($cache,json_encode($results));

キャッシュファイルを開くと、スラッシュ「/」がすべてエスケープされます。

http:\/\/distilleryimage4.instagram.com\/410e7...

json_encode()これを自動的に行う検索から収集します...それを無効にする方法はありますか?


2
オプションです: "エスケープする必要のある文字:引用符、逆ソリダス、および制御文字(U + 0000からU + 001F)。任意の文字をエスケープできます。"
ThiefMaster 2012

回答:


284

それを無効にする方法はありますか?

はい、JSON_UNESCAPED_SLASHESフラグを使用するだけで済みます。

!重要な前にお読みくださいhttps : //stackoverflow.com/a/10210367/367456(何を扱っているかを知ってください-敵を知ってください)

json_encode($str, JSON_UNESCAPED_SLASHES);

PHP 5.4が手元にない場合は、多数の既存の関数の1つを選択し、それらを必要に応じて変更します例:http : //snippets.dzone.com/posts/show/7487(archived copy))

デモの例

<?php
/*
 * Escaping the reverse-solidus character ("/", slash) is optional in JSON.
 *
 * This can be controlled with the JSON_UNESCAPED_SLASHES flag constant in PHP.
 *
 * @link http://stackoverflow.com/a/10210433/367456
 */    

$url = 'http://www.example.com/';

echo json_encode($url), "\n";

echo json_encode($url, JSON_UNESCAPED_SLASHES), "\n";

出力例:

"http:\/\/www.example.com\/"
"http://www.example.com/"

2
この答えはすごいですが、JSONエンコードは標準としてエスケープしたままにして、受信側でエスケープphpを取り消し、strip_slashesJSの場合はphpjs.org/functions/stripslashes
Barkermn01

1
@MartinBarker:これは、PHP 5.2.1でのみ問題であった可能性があります:3v4l.org/0AahO-JSONはどちらの場合でも有効です。
2015年

@MartinBarker奇妙な理由で、stripslashes()、str_replace()、またはpreg_replace()を使用して、フォワードスラッシュが受信側で削除されませんでした。この答えを見つける前に、urlencode()を使用して%2Fを置き換えることにより、スラッシュを取り除く方法を一緒にハッキングしました。WindowsでPHP7を使用しています。どこかにバグがあるかどうかはわかりませんが、PHP7にはマジッククオートさえ含まれていないため、スラッシュを無効にするだけでハッカーを回避することをお勧めします。
Sami Fouad

@SamiFouad:スラッシュがあっても正しいJSONであり、問​​題は発生しません(レシーバーがJSONを適切に処理していない場合を除き、json.orgを参照してください。特に、の有効なエスケープシーケンスとして明示的に指定されている右側のcharの説明を参照してください)。 、stackoverflow.com / a / 10210367/367456もご覧ください。\//
2017

醜いPHP!JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESPHP-開発者にそれを言うためにどのように...デフォルトではなく、(変な)オプションでなければなりませんか?
Peter Krauss

45

はい、ただしスラッシュをエスケープしないでください。<script>タグ内でJSONを使用する場合</script>、文字列内であってもスクリプトタグを終了する場所として必要です。

JSONが使用される場所によっては必要ありませんが、無視しても問題ありません。


5
それで、javascriptがjsonをプルしたときにバックスラッシュを自動的に削除しますか、これは私が指定する必要があるものですか?
マイケルC.

5
自動的に処理されます。他の多くの言語と同様に、言語で特別な意味のない文字をエスケープすると、それらの文字はそのままになります。
ThiefMaster 2012

19
@MichaelC。JSONでは、文字列値"\/"は文字列値とまったく同じです"/"-機能しているJSONパーサーはそれをそのように扱います。同じルールがJavaScript文字列にも適用されるため、JSONをJavaScriptコードとして提供しても問題は発生しません。PHPにもJSON_UNESCAPED_SLASHESフラグがあることに驚いています。
エサイリア2012

4
しかし、データをJSONにエンコードしてからデータベースの列に格納するとどうなるでしょうか。プログラムにデータベースのために文字をエスケープするメカニズムがある場合、スラッシュが二重にエスケープされているため、この機能は非常に不便ではないでしょうか。
Xavier_Ex 2014

5
JSON実装がスラッシュをエスケープしていると想定して、エンコード手順なしでJSONをスクリプトタグにダンプすることは、最終的にあなたに噛み付くのは確かな習慣のようです。
Ryan

3

反対に、PHPUNITがURLがjson_encodedされたURLに含まれているか等しいと主張している問題がありました-

私の期待:

http://localhost/api/v1/admin/logs/testLog.log

エンコードされます:

http:\/\/localhost\/api\/v1\/admin\/logs\/testLog.log

比較を行う必要がある場合は、次を使用してURLを変換します。

addcslashes($url, '/')

私の比較中に適切な出力を許可しました。


0

私はそのような状況に遭遇しなければなりませんでした、そして単に、

str_replace("\/","/",$variable)

私のために働きました


-1

スラッシュをエスケープする必要はありません!HTML5とJSでは、 '引用符だけでなく "引用符も使用できます。JSONでは、次のように入力します。

    "index4":{"<a href='http://example.com'>example</a>"}

実際の例として、ウェブサイトev.bingoを参照してください: "v4":["Audi e-tron Q4 Sportbackは、フォルクスワーゲングループで共有されているMEPPモジュラー電気推進プラットフォームを完全に利用しています"]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.