json_encode () หนีเครื่องหมายทับซ้าย


165

ฉันกำลังดึง JSON จาก Instagram:

$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

คำตอบ:


285

มีวิธีการปิดการใช้งานหรือไม่?

ใช่คุณจะต้องใช้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
คำตอบนี้เป็นตะแกรง แต่ JSON เข้ารหัสเป็นมาตรฐานที่คุณควรปล่อยให้มันเป็นหนีและจากนั้นในปลาย reciving ยกเลิก PHP การหลบหนีของstrip_slashesและ JS phpjs.org/functions/stripslashes
Barkermn01

1
@MartinBarker: นี่อาจเป็นปัญหาเฉพาะกับ PHP 5.2.1: 3v4l.org/0AahO - JSON นั้นใช้ได้ทั้งสองกรณี
hakre

@MartinBarker ด้วยเหตุผลบางอย่างที่ทำให้สแลชไปข้างหน้าไม่ได้ถูกดึงที่จุดรับที่มีแถบ (), str_replace () หรือ preg_replace () ก่อนที่ฉันจะพบคำตอบนี้ฉันแฮ็ควิธีกำจัดสแลชด้วยการใช้ urlencode () แล้วแทนที่% 2F ฉันใช้ PHP7 บน Windows ไม่แน่ใจว่ามีข้อผิดพลาดอยู่ที่ไหน แต่คำพูดเวทมนต์ไม่ได้รวมอยู่ใน PHP7 ดังนั้นจะเป็นการดีกว่าที่จะหลีกเลี่ยงการแฮกเกอร์โดยเพียงแค่ปิดใช้งานเครื่องหมายทับ
Sami Fouad

@SamiFouad: แม้จะมีการเฉือน แต่ก็เป็น JSON ที่ถูกต้องและไม่ควรสร้างปัญหาใด ๆ (เว้นแต่ผู้รับจะไม่จัดการ JSON อย่างถูกต้องโปรดดูjson.orgโดยเฉพาะคำอธิบายถ่านทางด้านขวาซึ่งระบุชื่ออย่างชัดเจน\/ว่าลำดับหนีที่ถูกต้องสำหรับ/) ดูstackoverflow.com/a/10210367/367456เช่นกัน
hakre

PHP น่าเกลียด! JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESจะต้องเป็นค่าเริ่มต้นได้ (แปลก) ตัวเลือก ... วิธีการบอกว่ามันเป็น PHP-พัฒนา?
Peter Krauss

45

ใช่แต่ไม่ได้ - การหลบหนีทับเป็นสิ่งที่ดี เมื่อใช้ JSON ภายใน<script>แท็กมันเป็นสิ่งจำเป็น</script>ทุกที่ - แม้ในสตริง - จะสิ้นสุดแท็กสคริปต์

ขึ้นอยู่กับตำแหน่งที่ใช้ JSON ไม่จำเป็น แต่สามารถเพิกเฉยได้อย่างปลอดภัย


5
ดังนั้นจาวาสคริปต์จะลบแบ็กสแลชโดยอัตโนมัติเมื่อมันดึงเข้ามาใน json หรือสิ่งที่ฉันต้องระบุ?
Michael C.

5
มันจะจัดการโดยอัตโนมัติ เช่นเดียวกับในภาษาอื่น ๆ อีกมากมายการหลีกเลี่ยงตัวละครที่ไม่มีความหมายพิเศษในภาษาเพียงแค่ทิ้งตัวอักษรเหล่านั้นไว้คนเดียว
ThiefMaster

19
@MichaelC ใน JSON ค่าสตริง"\/"จะเหมือนกับค่าสตริง"/"- และตัวแยกวิเคราะห์ JSON ที่ใช้งานได้จะถือว่าเป็นเช่นนั้น กฎเดียวกันนี้ใช้กับสตริง javascript ดังนั้นการป้อน JSON เป็นรหัส javascript จะไม่มีปัญหาใด ๆ ฉันประหลาดใจ PHP แม้มีJSON_UNESCAPED_SLASHESธง
Esailija

4
แต่ถ้ามีใครเข้ารหัสข้อมูลลงใน JSON แล้วเก็บไว้ในคอลัมน์ฐานข้อมูล หากโปรแกรมมีกลไกในการหลีกเลี่ยงอักขระเพื่อประโยชน์ของฐานข้อมูลคุณลักษณะนี้จะไม่สะดวกมากตั้งแต่ตอนนี้เครื่องหมายสแลชจะถูก Escape สองครั้งหรือไม่?
Xavier_Ex

5
การดัมพ์ JSON ลงในแท็กสคริปต์โดยไม่มีขั้นตอนการเข้ารหัสบนสมมติฐานที่ว่าการติดตั้ง JSON นั้นกำลังหลบหลีกการสแลชดูเหมือนว่าเป็นการฝึกฝนที่แน่นอนที่จะกัดคุณในที่สุด
Ryan

3

ในทางกลับกันฉันมีปัญหากับ PHPUNIT URL ยืนยันว่ามีอยู่ในหรือเท่ากับ URL ที่มี json_encoded -

ที่คาดหวังของฉัน:

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 Modular ซึ่งใช้ร่วมกันระหว่างกลุ่มโฟล์คสวาเก้น"],

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.