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

Я хочу отправить несколько переменных и строку с помощью метода 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>

person candino    schedule 02.07.2012    source источник


Ответы (8)


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

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

var wysiwyg_clean = encodeURIComponent(wysiwyg);

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

person Frédéric Hamidi    schedule 02.07.2012
comment
Достаточно ли этого, чтобы безопасно избежать данных, или этого достаточно, чтобы избежать проблемы с амперсандом? - person Wottensprels; 07.10.2014
comment
@Sprottenwels, достаточно правильно закодировать все данные. Что вы подразумеваете под безопасным в этом контексте? - person Frédéric Hamidi; 07.10.2014

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

encodeURIComponent("&quot;Busola&quot;"); // => %26quot%3BBusola%26quot%3B
person Wolfram    schedule 02.07.2012

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

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

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

person Ned Batchelder    schedule 02.07.2012

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

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

var wysiwyg_clean = encodeURIComponent(wysiwyg);

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

htmlspecialchars($_POST['wysiwyg']);

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

person Nadav S.    schedule 02.07.2012

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

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

OR

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

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

person deilkalb    schedule 10.08.2018

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

JavaScript (документ)

var wysiwyg_clean = window.btoa( wysiwyg );

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

var wysiwyg = base64_decode( $_POST['wysiwyg'] );
person Sirko    schedule 02.07.2012

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

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

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

person Christopher Tokar    schedule 02.07.2012

encodeURIComponent(Your text here);

Это усекает специальные символы.

person user10164982    schedule 01.08.2018
comment
Это не добавляет никакой ценности ответам выше - person Ivan Kaloyanov; 01.08.2018