web-dev-qa-db-ja.com

AJAX経由で「&」(アンパサンド)文字を送信するにはどうすればよいですか?

JavaScriptからPOSTメソッドを使用して、いくつかの変数と文字列を送信します。データベースから文字列を取得し、PHPページに送信します。 XMLHttpRequestオブジェクトを使用しています。問題は、文字列に文字「&」が数回含まれており、PHPの$ _POST配列が複数のキーのように見えることです。 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>
83
candino

encodeURIComponent() を使用できます。

URLで逐語的に発生できないすべての文字をエスケープします。

var wysiwyg_clean = encodeURIComponent(wysiwyg);

この例では、アンパサンド文字&は、URLで有効なエスケープシーケンス%26に置き換えられます。

154

encodeURIComponent() を使用することもできます。

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

アンパサンドをURLエスケープする必要があります。つかいます:

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

Wolframが指摘しているように、これはencodeURIComponentによって(他のすべての特殊文字とともに)うまく処理されます。

9
Ned Batchelder

Ramil Amrの答えは&文字に対してのみ有効です。他の特殊文字がある場合は、PHPのhtmlspecialchars()and JSのencodeURIComponent()を使用する必要があります。

あなたは書ける:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

そしてサーバー側で:

htmlspecialchars($_POST['wysiwyg']);

これにより、AJAXが期待どおりにデータを渡すようになり、PHP(データベースにデータを追加する場合)が期待どおりに機能するようになります。

4
Nadav S.

推奨される方法は、jQueryなどのJavaScriptライブラリを使用して、データオプションをオブジェクトとして設定し、次のようにjQueryにエンコードを行わせることです。

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

JQueryを使用できない場合(これは最近の標準です)、 encodeURIComponent を使用します。

1
encodeURIComponent(Your text here);

これにより、特殊文字が切り捨てられます。

0
user10164982

JavaScript側でBase64エンコードを使用して文字列をエンコードしてから、サーバー側でPHP(?)でデコードできます。

JavaScript( Doc

var wysiwyg_clean = window.btoa( wysiwyg );

PHP( Doc ):

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

この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

0
nikhilmeth