Bagaimana cara mengirim karakter “&” (ampersand) melalui AJAX?

90

Saya ingin mengirim beberapa variabel dan string dengan POSTmetode dari JavaScript.

Saya mendapatkan string dari database, dan kemudian mengirimkannya ke halaman PHP. Saya menggunakan sebuah XMLHttpRequestobjek.

Masalahnya adalah string berisi karakter &beberapa kali, dan $_POSTarray dalam PHP melihatnya seperti beberapa kunci.

Saya mencoba mengganti &dengan \&dengan replace()fungsi, tetapi sepertinya tidak melakukan apa-apa.

Adakah yang bisa membantu?

Kode javascript dan stringnya terlihat seperti ini:

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

Stringnya adalah:

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

Jawaban:

170

Anda dapat menggunakan encodeURIComponent () .

Ini akan melarikan diri dari semua karakter yang tidak dapat terjadi secara verbatim di URL:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

Dalam contoh ini, karakter ampersand &akan diganti dengan escape sequence %26yang valid di URL.

Frédéric Hamidi
sumber
Apakah ini cukup untuk keluar dari data dengan aman atau "cukup" untuk menghindari masalah ampersand?
Wottensprels
@Sprottenwels, itu cukup untuk mengenkode semua data dengan benar. Apa yang Anda maksud dengan "aman" dalam konteks ini?
Frédéric Hamidi
15

Anda mungkin ingin menggunakan encodeURIComponent () .

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

Anda perlu meng-escape url dari ampersand. Menggunakan:

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

Seperti yang ditunjukkan Wolfram, ini ditangani dengan baik (bersama dengan semua karakter khusus lainnya) oleh encodeURIComponent.

Ned Batchelder
sumber
4

Jawaban Ramil Amr hanya berlaku untuk karakter &. Jika Anda memiliki beberapa karakter khusus lainnya, Anda harus menggunakan PHP htmlspecialchars() dan JS encodeURIComponent().

Kamu bisa menulis:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

Dan di sisi server:

htmlspecialchars($_POST['wysiwyg']);

Ini akan memastikan bahwa AJAX akan meneruskan data seperti yang diharapkan, dan PHP (jika Anda memasukkan data ke database) akan memastikan data berfungsi seperti yang diharapkan.

Nadav S.
sumber
1

Anda dapat menyandikan string Anda menggunakan pengkodean Base64 di sisi JavaScript dan kemudian mendekodekannya di sisi server dengan PHP (?).

JavaScript ( Docu )

var wysiwyg_clean = window.btoa( wysiwyg );

PHP ( Docu ):

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

Cara yang disukai adalah menggunakan pustaka JavaScript seperti jQuery dan mengatur opsi data Anda sebagai objek, lalu biarkan jQuery melakukan pengkodean, seperti ini:

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

Jika Anda tidak dapat menggunakan jQuery (yang merupakan standar saat ini), gunakan encodeURIComponent .

Christopher Tokar
sumber
0
encodeURIComponent(Your text here);

Ini akan memotong karakter khusus.

pengguna10164982
sumber
Ini tidak menambah nilai jawaban di atas
Ivan Kaloyanov