슬래시를 이스케이프 처리하는 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

답변:


284

비활성화하는 방법이 있습니까?

예, JSON_UNESCAPED_SLASHES플래그 만 사용하면 됩니다.

! 중요한 글 : https://stackoverflow.com/a/10210367/367456 (당신이 다루고있는 것을 알고-적을 아십시오)

json_encode($str, JSON_UNESCAPED_SLASHES);

PHP 5.4가 없다면, 기존의 많은 기능 중 하나를 선택하여 필요에 따라 수정 하십시오 ( 예 : http://snippets.dzone.com/posts/show/7487 (아카이브 사본)). .

데모 예

<?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
이스케이프 PHP의 실행 취소 기기 수령 끝에서 다음 탈출로이 답변은 당신이 그것을 남겨 두어야 표준으로 화격자하지만 JSON 인코딩입니다 strip_slashes및 JS에 대한 phpjs.org/functions/stripslashes
Barkermn01

1
@MartinBarker : PHP 5.2.1에서만 문제가되었을 수 있습니다. 3v4l.org/0AahO-JSON 은 두 경우 모두에 유효합니다.
크레

@MartinBarker 이상한 이유로 슬래시가 수신 측에서 stripslashes (), str_replace () 또는 preg_replace ()로 제거되지 않았습니다. 이 답변을 찾기 전에 urlencode ()를 사용하고 % 2F를 대체하여 슬래시를 제거하는 방법을 함께 해킹했습니다. Windows에서 PHP7을 사용하고 있습니다. 버그가 있는지 확실하지 않지만 PHP7에는 마법 따옴표가 포함되어 있지 않으므로 단순히 슬래시를 비활성화하여 해커를 피하는 것이 좋습니다.
Sami Fouad

@SamiFouad : 슬래시가 있어도 올바른 JSON이며 문제를 일으키지 않아야합니다 (수신자가 JSON을 올바르게 처리하지 않는 한 json.org 참조 , 특히 오른쪽 의 char 설명은의 \/올바른 이스케이프 시퀀스로 명시 적으로 지정 됩니다 /) stackoverflow.com/a/10210367/367456 도 참조하십시오 .
hakre

못생긴 PHP! JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES해야합니다 기본값은 없습니다 (이상한) 옵션 ... 어떻게 PHP 개발자들에 대답?
피터 크라우스

45

. 그러나 슬래시를 이스케이프 처리 하지 않는 것이 좋습니다 . <script>태그 내부에서 JSON을 사용 </script>하는 경우 문자열 내부에서도 스크립트 태그를 종료해야합니다.

JSON이 사용되는 위치에 따라 필요하지 않지만 안전하게 무시할 수 있습니다.


5
그래서 자바 스크립트가 json을 가져올 때 자동으로 백 슬래시를 제거합니까, 아니면 내가 지정해야합니까?
Michael C.

5
자동으로 처리합니다. 다른 많은 언어와 마찬가지로 언어에서 특별한 의미가없는 문자를 이스케이프 처리하면 문자 만 남게됩니다.
ThiefMaster

19
@MichaelC. JSON에서 문자열 값 "\/"은 문자열 값 과 정확히 동일 "/"하며 작동하는 JSON 파서는이를 그대로 처리합니다. 동일한 규칙이 자바 스크립트 문자열에 적용되므로 JSON을 자바 스크립트 코드로 제공해도 아무런 문제가 없습니다. PHP에 JSON_UNESCAPED_SLASHES플래그 가 있다는 것도 놀랍습니다 .
Esailija

4
그러나 데이터를 JSON으로 인코딩 한 다음 데이터베이스 열에 저장하면 어떻게됩니까? 프로그램이 데이터베이스를 위해 문자를 이스케이프 처리하는 메커니즘이 있다면 슬래시가 이중 이스케이프 처리 되므로이 기능이 매우 불편하지 않습니까?
Xavier_Ex

5
JSON 구현이 슬래시를 이스케이프한다고 가정 할 때 인코딩 단계없이 JSON을 스크립트 태그에 덤프하면 결국 물린 것으로 보일 수 있습니다.
Ryan

3

반대로, URL이 json_encoded 된 URL에 포함되어 있다고 주장하는 PHPUNIT에 문제가 있습니다.

내 예상 :

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>"}

"v4": [ "Audi e-tron Q4 Sportback은 MEPP Modular Electric Propulsion Platform을 완전히 활용합니다 (Volkswagen Group간에 공유)"],

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.