我有一个调用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)
.