2

我有一个调用 php 文件的 ajax 脚本。

php 文件回显“是”或“否”,我想使用字符串进行逻辑比较。

在javascript中,我想比较responseText中的字符串,看看它是否是==到“是”(或“否”)。但比较失败。

所以我做了警报 responseText,它确实将“是”(或“否”)显示为字符串。但是我在这里读到 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 关闭标签(它们不是强制性的)。

于 2011-08-26T20:03:29.747 回答
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 回答
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 回答
0

您是否在发送数据之前尝试使用 PHP 的trim()函数?

于 2011-08-26T19:56:46.537 回答
0

在我的情况下,我通过删除require_once()方法所需的同一个 php 文件(“ ... ? > < ?php... ”)中两个 php 块之间的空格来解决这个问题。

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

--或者--您可以将数据作为 JSON 对象从服务器脚本 (php) 发送,为此您可以使用json_encode(). 对于客户端(javascript),您可以使用eval(this.responce).

于 2020-03-09T04:28:24.630 回答
0

即使可以在 php 标记之前或之后查看所有 PHP 脚本以避免 CRLF,这也不是一个好的选择,因为您可以想象在几天、几个月或几年内(不需要!)在文件中添加 CRLF 和这将影响您网站的另一部分。

实际上,要避免此问题,您有两种选择:

选项 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 回答