【问题标题】:responseText contains extra whitespace characters (new lines, line feeds), how to prevent and remove them?responseText 包含额外的空白字符(换行符,换行符),如何防止和删除它们?
【发布时间】:2011-11-04 19:23:42
【问题描述】:

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

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

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

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

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

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

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

TIA

【问题讨论】:

  • 您可以编写一个正则表达式来仅删除换行符和/或换行符,而忽略其他形式的空格。 /\r?\n?$/ 应该这样做。

标签: php javascript ajax responsetext


【解决方案1】:

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

错了。这很容易验证:创建一个 test.php 文件,将这个并且只有这个:<?php echo "test";(没有?>)写入其中并执行它。不会有空格。

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

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

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

【讨论】:

  • 谢谢你,arnaud,这是我正在寻找的解释额外字符外观的解释。它有效,我只需要记住这一点,在 php 文件中没有额外的回车符。我不知道结束标签不是必需的,很高兴知道。
【解决方案2】:

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

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 组合),并转换为小写以进行比较。

【讨论】:

  • 不能解决问题的根源;)
  • 谢谢Ken,这个功能会派上用场的。 Arnaud 准确地解释了问题的原因。我会使用你的函数,以防我的 php 文件中有多余的空格。
【解决方案3】:

我认为你可能走错了路。与其手动尝试创建响应,为什么不使用 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;

【讨论】:

  • 感谢您抽出宝贵时间,但我的目的不需要 json
【解决方案4】:

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

【讨论】:

  • 这会删除有意的空格,但这并不能解决问题的根源;)
  • Trim() 仅删除字符串开头/结尾的空格 - 而不是单词之间的实际空格。
  • 响应的开头或结尾可能有故意的空格;)(OP要求不要删除它们)
  • 他没有具体说开头/结尾会有有意的空格,只是他不想删除有意的空格。
  • 感谢 Ashley,在这种情况下 php trim 不能解决问题。额外的空格是在数据传输回 javascript 期间添加的,请参阅 arnaud 的解释。
【解决方案5】:

即使可以在 php 标记之前或之后查看所有 PHP 脚本以避免 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;

【讨论】:

    【解决方案6】:

    在我的情况下,我通过删除同一个 php 文件 ( "...? &gt; &lt; ?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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 2011-08-27
      相关资源
      最近更新 更多