Pengkodean URL melihat "&" (ampersand) sebagai "& amp;" Entitas HTML


293

Saya menyandikan string yang akan dikirimkan dalam URL (via GET). Tetapi jika saya menggunakan escape, encodeURIatau encodeURIComponent, &akan diganti dengan %26amp%3B, tetapi saya ingin itu diganti dengan %26. Apa yang saya lakukan salah?


Dari mana asalnya? Bisakah Anda memposting kode yang Anda miliki sejauh ini?
— Andy E

1
&adalah cara yang tepat untuk menghindari ampersand dalam konteks HTML ... dari mana sumber Anda berasal? dan apa tujuannya? Mungkin lebih baik untuk melakukan sisi server ini misalnya.
— Nick Craver

Saya mengambil sesuatu dari badan HTML (dan itu adalah HTML yang disandikan (jadi, ada & amp; saya sadari sekarang)) dan saya harus memasukkannya dalam URL ... Jadi, saya perlu men-decode html (tapi bagaimana?) dan kemudian menyandikan string (dengan komponen encodeURIC) ...
— dododedodonl

2
menemukannya ... Saya menggunakan jquery .html (), bukan .text () ... stupid (A)
— dododedodonl

1
jQuery's .html () memetakan ke properti innerHTML , jadi masalahnya adalah seperti yang saya katakan dalam jawaban saya :-)
— Andy E

Jawaban:


438

Tanpa melihat kode Anda, sulit untuk menjawab selain tikaman dalam gelap. Saya kira string yang Anda lewati ke encodeURIComponent () , yang merupakan metode yang tepat untuk digunakan, berasal dari hasil mengakses properti innerHTML . Solusinya adalah mendapatkan nilai properti innerText / textContent sebagai gantinya:

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

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

Jika bukan itu masalahnya, Anda dapat menggunakan metode replace () untuk mengganti entitas HTML:

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

94

Jika Anda benar-benar melakukan ini:

encodeURIComponent('&')

Maka hasilnya adalah %26, Anda bisa mengujinya di sini . Pastikan string yang Anda encode itu adil & dan tidak &dimulai dengan ... jika tidak, encoding dengan benar, yang mungkin terjadi. Jika Anda memerlukan hasil yang berbeda untuk beberapa alasan, Anda dapat melakukan .replace(/&/g,'&')sebelum penyandian.


3
... itu mungkin masalahnya.
— Pekka

2

Ada penyandian HTML dan URI. &adalah & dikodekan dalam HTML sementara %26adalah &di URI encoding .

Jadi sebelum URI menyandikan string Anda, Anda mungkin ingin mendekode HTML dan kemudian URI menyandikannya :)

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

hasil %26AndOtherHTMLEncodedStuff

Semoga ini menghemat waktu Anda

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.