Как я могу отправить символ «&» (амперсанд) через AJAX?

92

Я хочу отправить несколько переменных и строку с POSTметодом из JavaScript.

Я получаю строку из базы данных и затем отправляю ее на страницу PHP. Я использую XMLHttpRequestобъект.

Проблема в том, что строка содержит символ &несколько раз, а $_POSTмассив в PHP воспринимает его как несколько ключей.

Я пытался замены &с \&с replace()функцией, но это , кажется, не делать ничего.

Кто-нибудь может помочь?

Код javascript и строка выглядят так:

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

Строка:

 <span class="style2">&quot;Busola&quot;</span>
Candino
источник

Ответы:

171

Вы можете использовать encodeURIComponent () .

Он будет экранировать все символы, которые не могут дословно встречаться в URL-адресах:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

В этом примере символ амперсанда &будет заменен escape-последовательностью %26, которая действительна в URL-адресах.

Фредерик Хамиди
источник
Достаточно ли этого для безопасного экранирования данных или «всего лишь», чтобы избежать проблемы амперсанда?
Wottensprels
@Sprottenwels, достаточно правильно закодировать все данные. Что вы имеете в виду под словом «безопасно» в этом контексте?
Фредерик Хамиди
15

Возможно, вы захотите использовать encodeURIComponent () .

encodeURIComponent("&quot;Busola&quot;"); // => %26quot%3BBusola%26quot%3B
Вольфрам
источник
9

Вам нужно экранировать URL-адрес амперсанда. Использование:

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

Как указывает Вольфрам, с этим (вместе со всеми другими специальными символами) прекрасно справляется encodeURIComponent.

Нед Батчелдер
источник
4

Ответ Рамиля Амра работает только для символа &. Если у вас есть другие специальные символы, вам следует использовать PHP htmlspecialchars() и JS encodeURIComponent().

Ты можешь написать:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

А на стороне сервера:

htmlspecialchars($_POST['wysiwyg']);

Это гарантирует, что AJAX будет передавать данные, как ожидалось, и что PHP (в случае, если вы вставляете данные в базу данных) будет гарантировать, что данные работают должным образом.

Надав С.
источник
2

Вы можете передавать свои аргументы, используя эту функцию encodeURIComponent, поэтому вам не нужно беспокоиться о передаче каких-либо специальных символов.

data: "param1=getAccNos&param2="+encodeURIComponent('Dolce & Gabbana') 

ИЛИ ЖЕ

var someValue = 'Dolce & Gabbana';
data: "param1=getAccNos&param2="+encodeURIComponent(someValue)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

Deilkalb
источник
1

Вы можете закодировать свою строку, используя кодировку Base64 на стороне JavaScript, а затем декодировать ее на стороне сервера с помощью PHP (?).

JavaScript ( Документ )

var wysiwyg_clean = window.btoa( wysiwyg );

PHP ( Документ ):

var wysiwyg = base64_decode( $_POST['wysiwyg'] );
Сирко
источник
1

Предпочтительный способ - использовать библиотеку JavaScript, такую ​​как jQuery, и установить параметр данных в качестве объекта, а затем позволить jQuery выполнить кодирование, например:

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

Если вы не можете использовать jQuery (который в наши дни в значительной степени является стандартом), используйте encodeURIComponent .

Кристофер Токар
источник
0
encodeURIComponent(Your text here);

Это приведет к усечению специальных символов.

user10164982
источник
Это не добавляет ценности вышеприведенным ответам
Иван Калоянов