Comment puis-je envoyer le caractère «&» (esperluette) via AJAX?

90

Je veux envoyer quelques variables et une chaîne avec la POSTméthode de JavaScript.

J'obtiens la chaîne de la base de données, puis je l'envoie à une page PHP. J'utilise un XMLHttpRequestobjet.

Le problème est que la chaîne contient le caractère &plusieurs fois et que le $_POSTtableau en PHP le voit comme plusieurs clés.

J'ai essayé de remplacer le &par \&par la replace()fonction, mais cela ne semble rien faire.

Quelqu'un peut-il aider?

Le code javascript et la chaîne ressemblent à ceci:

var wysiwyg = dijit.byId("wysiwyg").get("value");
var wysiwyg_clean = wysiwyg.replace('&','\&');

var poststr = "act=save";

poststr+="&titlu="+frm.value.titlu;
poststr+="&sectiune="+frm.value.sectiune;
poststr+="&wysiwyg="+wysiwyg_clean;
poststr+="&id_text="+frm.value.id_text;

xmlhttp.open("POST","lista_ajax.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(poststr);

La chaîne est:

 <span class="style2">&quot;Busola&quot;</span>
Candino
la source

Réponses:

170

Vous pouvez utiliser encodeURIComponent () .

Il échappera à tous les caractères qui ne peuvent pas apparaître textuellement dans les URL:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

Dans cet exemple, le caractère esperluette &sera remplacé par la séquence d'échappement %26, qui est valide dans les URL.

Frédéric Hamidi
la source
Est-ce suffisant pour échapper en toute sécurité aux données ou est-ce "juste" suffisant pour éviter le problème de l'esperluette?
Wottensprels
@Sprottenwels, il suffit d'encoder correctement toutes les données. Qu'entendez-vous par «en toute sécurité» dans ce contexte?
Frédéric Hamidi
15

Vous voudrez peut-être utiliser encodeURIComponent () .

encodeURIComponent("&quot;Busola&quot;"); // => %26quot%3BBusola%26quot%3B
Wolfram
la source
9

Vous devez échapper à l'url de l'esperluette. Utilisation:

var wysiwyg_clean = wysiwyg.replace('&', '%26');

Comme le souligne Wolfram, cela est bien géré (avec tous les autres caractères spéciaux) par encodeURIComponent.

Ned Batchelder
la source
4

La réponse de Ramil Amr ne fonctionne que pour le caractère &. Si vous avez d'autres caractères spéciaux, vous devez utiliser PHP htmlspecialchars() et JS encodeURIComponent().

Tu peux écrire:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

Et côté serveur:

htmlspecialchars($_POST['wysiwyg']);

Cela garantira que AJAX transmettra les données comme prévu, et que PHP (au cas où vous insérez les données dans une base de données) s'assurera que les données fonctionnent comme prévu.

Nadav S.
la source
1

Vous pouvez encoder votre chaîne en utilisant l'encodage Base64 côté JavaScript, puis la décoder côté serveur avec PHP (?).

JavaScript ( Docu )

var wysiwyg_clean = window.btoa( wysiwyg );

PHP ( Docu ):

var wysiwyg = base64_decode( $_POST['wysiwyg'] );
Sirko
la source
1

Le moyen préféré est d'utiliser une bibliothèque JavaScript telle que jQuery et de définir votre option de données en tant qu'objet, puis de laisser jQuery faire l'encodage, comme ceci:

$.ajax({
  type: "POST",
  url: "/link.json",
  data: { value: poststr },
  error: function(){ alert('some error occured'); }
});

Si vous ne pouvez pas utiliser jQuery (qui est à peu près la norme de nos jours), utilisez encodeURIComponent .

Christopher Tokar
la source
0
encodeURIComponent(Your text here);

Cela tronquera les caractères spéciaux.

user10164982
la source
Cela n'ajoute aucune valeur aux réponses ci
Ivan Kaloyanov