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


90

POSTJavaScriptのメソッドでいくつかの変数と文字列を送信したいと思います。

データベースから文字列を取得し、それを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>

回答:


170

encodeURIComponent()を使用できます。

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

var wysiwyg_clean = encodeURIComponent(wysiwyg);

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


これはデータを安全にエスケープするのに十分ですか、それともアンパサンドの問題を回避するのに「ちょうど」十分ですか?
Wottensprels

@Sprottenwels、すべてのデータを適切にエンコードするだけで十分です。この文脈で「安全に」とはどういう意味ですか?
フレデリックハミディ2014年


9

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

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

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


4

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

あなたは書ける:

var wysiwyg_clean = encodeURIComponent(wysiwyg);

そしてサーバー側では:

htmlspecialchars($_POST['wysiwyg']);

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



1

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

JavaScript(Docu

var wysiwyg_clean = window.btoa( wysiwyg );

PHP(Docu):

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

1

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

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

jQuery(最近はほとんど標準です)を使用できない場合は、encodeURIComponentを使用してください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.