PHP函数nl2br的奇怪行为

3

我一整晚都在重构我的小型Web应用程序。今天当我开始测试时,我发现的第一个错误是与系统PHP函数nl2br()有关的问题。

在我的本地主机上,我使用的是PHP版本5.2.9,并且根据PHP网站的说明,从4.0.5版本开始,nl2br()已经符合XHTML标准。

然而,我完全不明白为什么我的nl2br()返回<br>,而不是设置第二个参数为false后返回<br />

以下是我发现这个错误的方法:

public function eliminateTags($msg) {
    $setBrakes = nl2br($msg);
    $decodeHTML = htmlspecialchars_decode($setBrakes);

    # Check PHP version
    if((int)version_compare(PHP_VERSION, '4.0.5') == 1) {
        $withoutTags = strip_tags($decodeHTML, '<br />');
    } else {
        $withoutTags = strip_tags($decodeHTML, '<br>');
    }

    return $withoutTags;
}

2
我不能说我可以在最新的 PHP 5.2 中重现这个问题。变更日志中没有提到这个。你有一个可以重现这个问题的脚本吗? - Artefacto
1
您是如何检查br标签的? #您是否使用Firebug(或类似工具)? #您是否查看脚本生成的文件? #您是否检查脚本生成的字符串? - Eineki
默认情况下,它在5.3.2版本中使用<br /> - Matthew Flaschen
@Eug 我猜它会删除所有不完整的标签后面的内容(将其视为标签的一部分)。 - Artefacto
@Eugene 再次说明,我无法重现它。http://codepad.viper-7.com/MyfqrC(我假设您正在使用Anax的解决方案)。注意:回应随后删除评论。 - Artefacto
显示剩余10条评论
1个回答

4

我不确定你想通过这个函数实现什么。首先,你在每个新行中插入HTML断点,然后剥离除断点之外的所有标签。

难道先剥离标签再插入HTML断点不更合理吗?

public function eliminateTags($msg) {
    $decodeHTML = htmlspecialchars_decode($msg);
    $withoutTags = strip_tags($decodeHTML);
    $setBreaks = nl2br($withoutTags);

    return $setBreaks;
}

编辑:

显然,您没有正确使用strip_tags()。您需要询问PHP要排除哪个标签,这是<br>,而不是<br />。要求PHP排除<br />就像要求排除<p></p>一样,这是不起作用的。

这也意味着您不必检查PHP版本-strip_tags()将在所有版本中正常工作。


好的,那个方法可行。但是当我尝试另一种方式时可能会出现什么问题呢?我想编写一个方法来消除不需要的标签。例如,如果我写了<script>alert();</script>,但使用这种方法它将返回alret(); - Eugene
@Eugene strip_tags有一个“allowed tags”参数。 - Pekka
1
@Artefacto:事实上,我没有解决这个问题。相反,我选择消除它。尽管如此,我相信我也找到了导致错误的原因。 - Anax
@Anax,是的,我想你做到了。现在它按照我的计划工作了,顺便说一句,关于标签的识别,你给了一个好建议,因为没有提到它。 - Eugene
@Anax,你的代码比我尝试实现的要好得多。非常感谢你。还要感谢你提供关于<br><br />在函数strip_tags中作为参数的区别的提示。 - Eugene
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接