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


responseText contains extra whitespace characters (new lines, line feeds), how to prevent and remove them?

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

php文件回显"yes"或"no",我想使用字符串进行逻辑比较。

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

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

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

如果不使用regex,如何防止这些额外的空白,因为regex可能会删除有意的空白?

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

TIA

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

这是错误的。这很容易验证:创建一个test.php文件,在其中写入<?php echo "test";(不包含?>)并执行它。不能有空格

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

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

避免这个问题的最简单的方法是不要在文件末尾使用php关闭标签(它们不是强制性的)。

我知道你问过在没有正则表达式的情况下进行比较,但是考虑到你上面提到的条件,这将是一种非常快速有效的方法来得到你的答案,并且不一定会干扰任何其他处理。

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组合),并转换为小写,只是为了比较。

我想你可能用错了方法。与其手动创建响应,为什么不使用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;

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

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

事实上,为了避免这个问题,你有两个选择:

选项1:让php在开始时发送带有垃圾的数据,并在javascript中使用:

清理数据
 response = http.responseText;
 response = response.replace(/['n'r]+/g, '');

在这种情况下,这意味着清除所有的CRLF(如果需要,将Regex更改为仅在开始时清除,或者也清除空格)

选项2(我认为更好)是在将数据发送到浏览器之前立即清理PHP的输出缓冲区。所以:

 ... many code here
 ob_end_clean();
 echo $data_for_the_browser;

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

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

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