2

phpファイルを呼び出すajaxスクリプトがあります。

phpファイルは「yes」または「no」をエコーし​​ます。文字列を使用して論理比較を行います。

javascriptで、responseTextの文字列を比較して、==が「yes」(または「no」)であるかどうかを確認します。しかし、比較は失敗します。

したがって、アラートresponseTextを実行すると、文字列として「yes」(または「no」)が表示されます。しかし、ここでresponseTextに非表示の空白文字が含まれている可能性があることを読んだので、responseTextの文字列の長さを調べたところ、文字列の長さが本来より4文字長いことがわかりました。そこで、responseText alert(escape(responseText))をエスケープすると、responseText文字列の最後に%0Aと%0D(改行と改行)が非表示になっていることがわかります。

これらの文字はphpによって追加されることを読みましたが、余分な文字はphpのバージョン/サーバーによって異なることも読みました。

正規表現は意図的な空白を削除する可能性があるため、正規表現を使用せずにこれらの余分な空白を防ぐにはどうすればよいですか?

答えとしてjqueryやmootoolsを使用することを提案しないでください。

TIA

4

6 に答える 6

8

これらの文字はphpによって追加されることを読みましたが、余分な文字はphpのバージョン/サーバーによって異なることも読みました。

それは間違っている。確認は簡単です。test.phpファイルを作成し、これとこれだけを<?php echo "test";(なしで?>)書き込んで実行します。空白はありません。

これらの空白は、おそらくスクリプトに由来します。一般的なエラーは、phpタグ(?>)を閉じた後にいくつかの末尾の改行を残すことです。これにより、新しい行が出力されます。

前後に含まれるすべてのファイルにecho "yes";何もエコーがなく、。の後に改行がないことを確認します?>

この問題を回避する最も簡単な方法は、ファイルの最後にphp closeタグを使用しないことです(必須ではありません)。

于 2011-08-26T20:03:29.747 に答える
1

正規表現なしで比較を行うことについて質問されたことは知っていますが、上記の条件を考えると、それは答えを得るのに非常に迅速かつ効果的な方法であり、必ずしも他の処理を混乱させることはありません。

var trimmedResponse = responseText.replace(/^\s*/,'').replace(/\s*$/,'').toLowerCase();
if (trimmedResponse == 'yes') {
  // do your 'yes' case
} else if (trimmedResponse == 'no') {
  // do your 'no' case
} else {
  // do your 'none of the above' case
}

これにより、先頭の空白と末尾の空白(CR / LFコンボを含む)が削除され、比較のために小文字に変換されます。

于 2011-08-26T20:03:05.550 に答える
1

私はあなたがそれを間違った方法で行っているかもしれないと思います。手動で応答を作成する代わりに、PHP配列をデータ構造として使用し、JSONを配信に使用してみませんか?

<?php
$flag = false
if (condition){
  $flag = true;
}

$arr = array("is_true" => $flag)
$json = json_encode($arr);

// See http://www.geekality.net/2010/06/27/php-how-to-easily-provide-json-and-jsonp/
// Set JSONP header
header('content-type: application/json; charset=utf-8');

// Get callback from $_GET and prepend the JSON data
echo isset($_GET['callback'])
    ? "{$_GET['callback']}($json)"
    : $json;
于 2011-08-27T14:00:04.003 に答える
0

データを送信する前に、PHPのtrim()関数を使用してみましたか?

于 2011-08-26T19:56:46.537 に答える
0

phpタグの前後でCRLFを回避するためにすべてのPHPスクリプトの世話をすることが可能であるとしても、ファイルにCRLFを数日、数か月、または数年(必要なく!)追加することを想像できるので、これは良いオプションではありません。これは、Webサイトの別の部分に影響を与えます。

実際、この問題を回避するには、次の2つのオプションがあります。

オプション1:phpが最初にガベージを使用してデータを送信し、Javascrptのデータを次のようにクリーンアップします。

 response = http.responseText;
 response = response.replace(/[\n\r]+/g, '');

この場合、これはすべてのCRLFをクリーニングすることを意味します(必要に応じて最初にのみクリーニングするように、またはスペースもクリーニングするように正規表現を変更します)

オプション2(私が思うに)は、データをブラウザーに送信する前に、PHPの出力バッファーをすぐにクリーンアップすることです。それで:

 ... many code here
 ob_end_clean();
 echo $data_for_the_browser;
于 2018-01-16T14:04:35.703 に答える
0

私の場合、 require_once()メソッドで必要な同じphpファイル( " ... ? > < ?php... ")内の2つのphpブロック間のスペースを削除することでこの問題を解決しました。

<?php 
  //your code
?>
*this space might appear in the XHTTP responce*
<?php 
  //your code
?>

--または--サーバースクリプト(php)からJSONオブジェクトとしてデータを送信できます。これには、を使用できますjson_encode()。クライアント側(javascript)には、を使用できますeval(this.responce)

于 2020-03-09T04:28:24.630 に答える