การเข้ารหัส URL เห็น“ &” (เครื่องหมายแอมเปอร์แซนด์) เป็น“ & amp;” เอนทิตี HTML


293

ฉันกำลังเข้ารหัสสตริงที่จะส่งผ่านใน URL (ผ่าน GET) แต่ถ้าผมใช้escape, encodeURIหรือencodeURIComponent, &จะถูกแทนที่ด้วยแต่ผมอยากให้มันถูกแทนที่ด้วย%26amp%3B %26ผมทำอะไรผิดหรือเปล่า?


สตริงมาจากไหน คุณช่วยโพสต์รหัสที่คุณมีจนถึงตอนนี้ได้ไหม?
Andy E

1
&เป็นวิธีที่เหมาะสมในการหลบหนีแอมเปอร์แซนด์ในบริบท HTML ... แหล่งที่มาของคุณมาจากไหน? และปลายทางคืออะไร มันอาจจะดีกว่าถ้าทำฝั่งเซิร์ฟเวอร์นี้
Nick Craver

ฉันรับบางสิ่งบางอย่างจากเนื้อหา HTML (และนั่นคือการเข้ารหัส HTML (ดังนั้นมี & amp; ฉันรู้ตอนนี้)) และฉันต้องผ่านมันใน URL ... ดังนั้นฉันต้องถอดรหัส html (แต่อย่างไร) en จากนั้นเข้ารหัสสตริง (พร้อม encodeURIComponent) ...
dododedodonl

2
พบว่า ... ฉันใช้ jquery .html () ไม่ใช่. text () ... stupid (A)
dododedodonl

1
jQuery's .html ()จับคู่กับคุณสมบัติinnerHTMLดังนั้นปัญหาก็คือตามที่ฉันพูดในคำตอบของฉัน :-)
Andy E

คำตอบ:


438

การไม่เห็นรหัสของคุณเป็นการยากที่จะตอบคำถามอื่นนอกจากแทงในที่มืด ฉันเดาว่าสตริงที่คุณส่งไปยังencodeURIComponent ()ซึ่งเป็นวิธีที่ถูกต้องในการใช้งานนั้นมาจากผลลัพธ์ของการเข้าถึงคุณสมบัติInnerHTML วิธีแก้ไขคือรับค่าคุณสมบัติinnerText / textContentแทน:

var str, 
    el = document.getElementById("myUrl");

if ("textContent" in el)
    str = encodeURIComponent(el.textContent);
else
    str = encodeURIComponent(el.innerText);

หากไม่เป็นเช่นนั้นคุณสามารถใช้เมธอดreplace ()เพื่อแทนที่เอนทิตี HTML:

encodeURIComponent(str.replace(/&/g, "&"));

94

หากคุณทำสิ่งนี้อย่างแท้จริง:

encodeURIComponent('&')

แล้วผลที่ได้คือ%26, คุณสามารถทดสอบได้ที่นี่ ตรวจสอบให้แน่ใจสตริงที่คุณกำลังเข้ารหัสเป็นเพียง &และไม่ได้&เริ่มต้นด้วย ... มิฉะนั้นจะถูกเข้ารหัสอย่างถูกต้องซึ่งมีแนวโน้มกรณี หากคุณต้องการผลลัพธ์ที่แตกต่างด้วยเหตุผลบางอย่างคุณสามารถทำได้.replace(/&/g,'&')ก่อนการเข้ารหัส


3
... นั่นอาจเป็นปัญหาของเขา
Pekka

2

มีการเข้ารหัส HTML และ URI &มีการ& เข้ารหัสในรูปแบบ HTMLในขณะที่%26เป็น&ในการเข้ารหัส URI

ดังนั้นก่อนที่ URI จะเข้ารหัสสตริงของคุณคุณอาจต้องการที่จะถอดรหัส HTML และจากนั้น URI เข้ารหัสมัน :)

var div = document.createElement('div');
div.innerHTML = '&AndOtherHTMLEncodedStuff';
var htmlDecoded = div.firstChild.nodeValue;
var urlEncoded = encodeURIComponent(htmlDecoded);

ผลลัพธ์ %26AndOtherHTMLEncodedStuff

หวังว่านี่จะช่วยคุณประหยัดเวลา

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