2010-08-22 13 views
283

Je suis en train d'encoder une chaîne qui sera passée dans une URL (via GET). Mais si j'utilise escape, encodeURI ou encodeURIComponent, & sera remplacé par %26amp%3B, mais je veux qu'il soit remplacé par %26. Qu'est-ce que je fais mal?Le code URL voit "&" (ampersand) comme "&" Entité HTML

+0

Si la chaîne ne vient de? Pouvez-vous poster le code que vous avez déjà? –

+1

'&' est le bon moyen d'échapper l'esperluette dans un contexte HTML ... d'où vient votre source? et quelle est la destination? Il peut être préférable de faire ce côté serveur par exemple. –

+0

Je grap quelque chose du corps HTML (et c'est codé HTML (donc, il ya & je me rends compte maintenant)) et je dois le passer dans une URL ... Donc, j'ai besoin de décoder le html (mais comment?) puis encoder la chaîne (avec encodeURIComponent) ... – dododedodonl

Répondre

422

Sans voir votre code, il est difficile de répondre autrement qu'un coup de couteau dans l'obscurité. Je suppose que la chaîne que vous passez à encodeURIComponent(), qui est la méthode correcte à utiliser, provient du résultat de l'accès à la propriété innerHTML. La solution est d'obtenir le innerText/textContent valeur de la propriété à la place:

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

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

Si ce n'est pas le cas, vous pouvez utiliser la méthode remplacer() pour remplacer l'entité HTML:

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

Si vous avez littéralement ceci:

encodeURIComponent('&') 

le résultat est %26, you can test it here. Assurez-vous que la chaîne que vous êtes en train d'encoder est juste& et non & pour commencer ... sinon, elle est encodée correctement, ce qui est probablement le cas. Si vous avez besoin d'un résultat différent pour une raison quelconque, vous pouvez faire un .replace(/&/g,'&') avant l'encodage.

+3

... c'est probablement son problème. –

2

Il existe des codages HTML et URI. & est &encoded in HTML tandis que %26 est & dans URI encoding.

Donc, avant l'encodage de votre URI chaîne que vous voudrez peut-être HTML decode et URI encoder :)

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

résultat %26AndOtherHTMLEncodedStuff

espère que cela vous permet d'économiser un peu de temps