Le codage d'URL voit «&» (esperluette) comme «& amp;» Entité HTML

293

J'encode une chaîne qui sera passée dans une URL (via GET). Mais si j'utilise escape, encodeURIou encodeURIComponent, &sera remplacé par %26amp%3B, mais je veux qu'il soit remplacé par %26. Qu'est-ce que je fais mal?

dododedodonl
la source
D'où vient la chaîne? Pouvez-vous publier le code que vous avez jusqu'à présent?
Andy E
1
&est la bonne façon 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 cela côté serveur par exemple.
Nick Craver
Je récupère quelque chose dans le corps HTML (et qui est encodé en HTML (donc il y a & amp; je m'en rends compte maintenant)) et je dois le passer dans une URL ... Donc, j'ai besoin de décoder le html (mais comment?) puis encodez la chaîne (avec encodeURIComponent) ...
dododedodonl
2
je l'ai trouvé ... J'ai utilisé dans jquery .html (), pas .text () ... stupide (A)
dododedodonl
1
.html () de jQuery correspond à la propriété innerHTML , donc le problème est comme je l'ai dit dans ma réponse :-)
Andy E

Réponses:

438

Sans voir votre code, il est difficile de répondre à part un coup de couteau dans le noir. Je suppose que la chaîne que vous passez à encodeURIComponent () , qui est la bonne méthode à utiliser, provient du résultat de l'accès à la propriété innerHTML . La solution est d'obtenir la 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 replace () pour remplacer l'entité HTML:

encodeURIComponent(str.replace(/&/g, "&"));
Andy E
la source
94

Si vous l'avez fait littéralement:

encodeURIComponent('&')

Ensuite, le résultat est %26, vous pouvez le tester ici . Assurez-vous que la chaîne que vous encodez 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.

Nick Craver
la source
3
... c'est probablement son problème.
Pekka
2

Il existe des encodages HTML et URI. &est & codé en HTML alors qu'il %26est &en codage URI .

Donc, avant de coder l'URI de votre chaîne, vous voudrez peut-être décoder HTML puis coder l'URI :)

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

résultat %26AndOtherHTMLEncodedStuff

J'espère que cela vous fait gagner du temps

Matas Vaitkevicius
la source