responseText包含额外的空白字符(新行,换行符),如何防止和删除它们?

时间:2011-08-26 19:51:37

标签: php javascript ajax responsetext

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

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

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

所以我做了警告responseText,它确实显示“是”(或“否”)作为字符串。但我在这里读到,responseText可能包含隐藏的空白字符,所以我做了responseText的字符串长度,它表明字符串长度比应该的长4个字符。所以我转发了responseText警报(escape(responseText)),它显示我在responseText字符串的末尾隐藏了%0A和%0D(换行符和换行符)。

我读到这些字符是由php添加的,但我也读到不同的php版本/服务器之间的额外字符是不同的。

如何在不使用正则表达式的情况下防止这些额外的空格,因为正则表达式可能会删除有意的空格?

请不要建议使用jquery或mootools作为答案。

TIA

6 个答案:

答案 0 :(得分:7)

  

我读到这些字符是由php添加的,但我也读到不同的php版本/服务器中额外的字符是不同的。

那是错的。这很容易验证:创建一个test.php文件,只写这个:<?php echo "test";(没有?>)并执行它。没有空格。

这些空格很可能来自你的脚本。一个常见错误是在关闭php标记(?>)之后留下一些尾随换行符,这会导致打印一个新行。

确认echo "yes";之前或之后包含的所有文件都不回显任何内容,并且在?>之后没有尾随换行符。

避免此问题的最简单方法是不要在文件末尾使用php close标记(它们不是必需的)。

答案 1 :(得分: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组合),并转换为小写仅供比较。

答案 2 :(得分: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;

答案 3 :(得分:0)

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

答案 4 :(得分: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;

答案 5 :(得分:0)

就我而言,我通过删除同一php文件中的两个php块之间的空格(“ ... {? > < ?php ... ”)解决了此问题它需要通过 require_once()方法来实现。

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

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