Como posso enviar o caractere “&” (e comercial) via AJAX?

87

Quero enviar algumas variáveis ​​e uma string com o POSTmétodo do JavaScript.

Pego a string do banco de dados e a envio para uma página PHP. Estou usando um XMLHttpRequestobjeto.

O problema é que a string contém o caractere &algumas vezes, e o $_POSTarray em PHP o vê como várias chaves.

Tentei substituir o &por \&pela replace()função, mas parece não fazer nada.

Alguém pode ajudar?

O código javascript e a string têm a seguinte aparência:

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);

O String é:

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

Respostas:

167

Você pode usar encodeURIComponent () .

Irá escapar todos os caracteres que não podem ocorrer literalmente em URLs:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

Neste exemplo, o caractere e comercial &será substituído pela sequência de escape %26, que é válida em URLs.

Frédéric Hamidi
fonte
Isso é suficiente para escapar com segurança dos dados ou é "apenas" o suficiente para evitar o problema do e comercial?
Wottensprels,
@Sprottenwels, é o suficiente para codificar corretamente todos os dados. O que você quer dizer com "segurança" neste contexto?
Frédéric Hamidi
15

Você pode querer usar encodeURIComponent () .

encodeURIComponent("&quot;Busola&quot;"); // => %26quot%3BBusola%26quot%3B
Volfrâmio
fonte
9

Você precisa fazer o escape de url do "e" comercial. Usar:

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

Como Wolfram aponta, isso é bem tratado (junto com todos os outros caracteres especiais) por encodeURIComponent.

Ned Batchelder
fonte
4

A resposta de Ramil Amr funciona apenas para o personagem &. Se você tiver alguns outros caracteres especiais, você deve usar PHP htmlspecialchars() e JS encodeURIComponent().

Você pode escrever:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

E no lado do servidor:

htmlspecialchars($_POST['wysiwyg']);

Isso garantirá que AJAX passará os dados conforme o esperado e que o PHP (no caso de você inserir os dados em um banco de dados) garantirá que os dados funcionem conforme o esperado.

Nadav S.
fonte
1

A forma preferida é usar uma biblioteca JavaScript como jQuery e definir sua opção de dados como um objeto, então deixe jQuery fazer a codificação, assim:

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

Se você não pode usar jQuery (que é praticamente o padrão atualmente), use encodeURIComponent .

Christopher Tokar
fonte
0

Você pode codificar sua string usando a codificação Base64 no lado do JavaScript e então decodificá-la no lado do servidor com PHP (?).

JavaScript ( Docu )

var wysiwyg_clean = window.btoa( wysiwyg );

PHP ( Docu ):

var wysiwyg = base64_decode( $_POST['wysiwyg'] );
Sirko
fonte
0
encodeURIComponent(Your text here);

Isso truncará caracteres especiais.

user10164982
fonte
Isso não adiciona nenhum valor às respostas acima
Ivan Kaloyanov