json_encode () thoát khỏi dấu gạch chéo về phía trước


164

Tôi đang lấy JSON từ Instagram:

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

Sau đó phân tích cú pháp các biến thành một mảng PHP để cơ cấu lại dữ liệu, sau đó mã hóa lại và lưu trữ tệp vào bộ đệm:

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

Khi tôi mở tệp bộ đệm, tất cả các dấu gạch chéo về phía trước của tôi "/" đang được thoát:

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

Tôi thu thập từ các tìm kiếm của mình mà json_encode()tự động thực hiện điều này ... có cách nào để vô hiệu hóa nó không?


2
Đây là tùy chọn: "các ký tự phải được thoát: dấu ngoặc kép, solidus ngược và các ký tự điều khiển (U + 0000 đến U + 001F). Bất kỳ ký tự nào cũng có thể được thoát."
ThiefMaster

Câu trả lời:


284

Có cách nào để vô hiệu hóa nó?

Có, bạn chỉ cần sử dụng JSON_UNESCAPED_SLASHEScờ.

! quan trọng đọc trước: https://stackoverflow.com/a/10210367/387456 (biết những gì bạn đang đối phó - biết kẻ thù của bạn)

json_encode($str, JSON_UNESCAPED_SLASHES);

Nếu bạn không có sẵn PHP 5.4, hãy chọn một trong nhiều hàm hiện có và sửa đổi chúng theo nhu cầu của bạn, ví dụ: http://snippets.dzone.com/posts/show/7487 (bản sao lưu trữ) .

Ví dụ Demo

<?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";

Kết quả ví dụ:

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

2
Câu trả lời này rất hữu ích nhưng mã hóa JSON là tiêu chuẩn, bạn nên để nó như thoát và sau đó trong phần hồi quy cho đến khi thoát php strip_slashesvà cho JS phpjs.org/fifts/stripslashes
Barkermn01

1
@MartinBarker: Đây có thể chỉ là một vấn đề với PHP 5.2.1: 3v4l.org/0AahO - JSON có hiệu lực trong cả hai trường hợp.
hakre

@MartinBarker Vì một số lý do kỳ lạ, dấu gạch chéo phía trước không bị tước ở đầu nhận với các dấu gạch chéo (), str numplace () hoặc preg numplace (). Trước khi tôi tìm thấy câu trả lời này, tôi đã cùng nhau tìm cách loại bỏ dấu gạch chéo bằng cách sử dụng urlencode () và sau đó thay thế% 2F. Tôi đang sử dụng PHP7 trên Windows. Không chắc chắn có lỗi ở đâu đó không, nhưng các trích dẫn ma thuật thậm chí không được bao gồm trong PHP7, vì vậy tốt hơn hết là tránh các tin tặc bằng cách vô hiệu hóa các dấu gạch chéo.
Sami Fouad

@SamiFouad: Ngay cả với dấu gạch chéo, đó là JSON chính xác và không nên tạo ra bất kỳ vấn đề nào (trừ khi người nhận không xử lý JSON đúng cách, hãy xem json.org , đặc biệt là mô tả char ở bên phải có tên rõ ràng \/là chuỗi thoát hợp lệ /) , xem stackoverflow.com/a/10210367/387456 là tốt.
hakre

PHP xấu xí! những JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESphải mặc định, không (lạ) tùy chọn ... Làm thế nào để nói nó để php-nhà phát triển?
Peter Krauss

45

, nhưng không - thoát khỏi dấu gạch chéo về phía trước là một điều tốt . Khi sử dụng JSON bên trong <script>các thẻ, nó cần thiết ở </script>mọi nơi - ngay cả trong chuỗi - sẽ kết thúc thẻ script.

Tùy thuộc vào nơi JSON được sử dụng, nó không cần thiết, nhưng nó có thể được bỏ qua một cách an toàn.


5
Vì vậy, javascript sẽ tự động loại bỏ các dấu gạch chéo ngược khi nó xuất hiện trong json, hay đây là thứ tôi cần chỉ định?
Michael C.

5
Nó sẽ tự động xử lý nó. Giống như trong nhiều ngôn ngữ khác, việc thoát khỏi các ký tự không có ý nghĩa đặc biệt trong ngôn ngữ chỉ để lại các ký tự đó.
ThiefMaster

19
@MichaelC. Trong JSON, giá trị chuỗi "\/"hoàn toàn giống với giá trị chuỗi "/"- và trình phân tích cú pháp JSON hoạt động sẽ xử lý như vậy. Quy tắc tương tự áp dụng cho các chuỗi javascript, do đó, việc cung cấp JSON dưới dạng mã javascript cũng sẽ không gặp rắc rối nào. Tôi ngạc nhiên PHP thậm chí có JSON_UNESCAPED_SLASHEScờ.
Esailija

4
Nhưng nếu người ta mã hóa dữ liệu vào JSON và sau đó lưu trữ chúng vào cột cơ sở dữ liệu thì sao? Nếu chương trình có một số cơ chế để thoát các ký tự cho cơ sở dữ liệu, thì tính năng này có bất tiện không vì bây giờ các dấu gạch chéo đang được thoát hai lần?
Xavier_Ex

5
Việc bỏ JSON vào các thẻ script mà không có bước mã hóa với giả định rằng việc triển khai JSON đã thoát khỏi dấu gạch chéo có vẻ như là một thực tế chắc chắn cuối cùng sẽ cắn bạn.
Ryan

3

Mặt khác, tôi đã gặp vấn đề với PHPUNIT khi khẳng định các url được chứa trong hoặc bằng một url được json_encoding -

mong đợi của tôi:

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

sẽ được mã hóa thành:

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

Nếu bạn cần làm một phép so sánh, chuyển đổi url bằng cách sử dụng:

addcslashes($url, '/')

cho phép đầu ra thích hợp trong quá trình so sánh của tôi.


0

Tôi đã phải gặp một tình huống như vậy, và đơn giản,

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

đã làm việc cho tôi.


-1

Bạn không cần phải thoát khỏi dấu gạch chéo về phía trước! HTML5 và JS cho phép sử dụng 'dấu ngoặc kép cũng như "dấu ngoặc kép. Vì vậy, trong JSON I gõ:

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

Xem trang web ev.bingo làm ví dụ hoạt động: "v4": ["Audi e-tron Q4 Sportback sử dụng hoàn toàn Nền tảng động cơ điện mô-đun MEPP, được chia sẻ giữa Tập đoàn Volkswagen"],

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.