¿Cómo puedo enviar el carácter "&" (ampersand) a través de AJAX?

90

Quiero enviar algunas variables y una cadena con el POSTmétodo de JavaScript.

Obtengo la cadena de la base de datos y luego la envío a una página PHP. Estoy usando un XMLHttpRequestobjeto.

El problema es que la cadena contiene el carácter &varias veces y la $_POSTmatriz en PHP lo ve como múltiples claves.

Intenté reemplazar el &con \&con la replace()función, pero parece que no hace nada.

¿Alguien puede ayudar?

El código javascript y la cadena se ven así:

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 cadena es:

 <span class="style2">&quot;Busola&quot;</span>
candino
fuente

Respuestas:

170

Puede utilizar encodeURIComponent () .

Se escaparán todos los caracteres que no pueden aparecer literalmente en las URL:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

En este ejemplo, el carácter ampersand &será reemplazado por la secuencia de escape %26, que es válida en las URL.

Frédéric Hamidi
fuente
¿Es esto suficiente para escapar de forma segura de los datos o es "solo" suficiente para evitar el problema comercial?
Wottensprels
@Sprottenwels, es suficiente codificar correctamente todos los datos. ¿Qué quiere decir con "de forma segura" en este contexto?
Frédéric Hamidi
15

Es posible que desee utilizar encodeURIComponent () .

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

Necesita url-escapar del ampersand. Utilizar:

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

Como señala Wolfram, esto se maneja muy bien (junto con todos los demás caracteres especiales) por encodeURIComponent.

Ned Batchelder
fuente
4

La respuesta de Ramil Amr funciona solo para el carácter &. Si tiene otros caracteres especiales, debe usar PHP htmlspecialchars() y JS encodeURIComponent().

Puedes escribir:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

Y en el lado del servidor:

htmlspecialchars($_POST['wysiwyg']);

Esto asegurará que AJAX pasará los datos como se espera, y que PHP (en caso de que esté ingresando los datos en una base de datos) se asegurará de que los datos funcionen como se espera.

Nadav S.
fuente
1

Puede codificar su cadena usando la codificación Base64 en el lado de JavaScript y luego decodificarla en el lado del servidor con PHP (?).

JavaScript ( Docu )

var wysiwyg_clean = window.btoa( wysiwyg );

PHP ( Docu ):

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

La forma preferida es usar una biblioteca de JavaScript como jQuery y configurar su opción de datos como un objeto, luego dejar que jQuery haga la codificación, así:

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

Si no puede usar jQuery (que es prácticamente el estándar en estos días), use encodeURIComponent .

Christopher Tokar
fuente
0
encodeURIComponent(Your text here);

Esto truncará los caracteres especiales.

usuario10164982
fuente
Esto no agrega ningún valor a las respuestas anteriores
Ivan Kaloyanov