FILTER_SANITIZE_SPECIAL_CHARS在处理换行符时存在问题

6

有人知道如何防止FILTER_SANITIZE_SPECIAL_CHARS将换行符(\n)转换为(
)吗。

我正在为我的网站开发一个简单的评论系统,我发现php过滤器将\n转换为,因此在使用nl2br()时没有换行符。

请帮忙解决。

谢谢:)


你有一些代码可以展示换行符被转换成分号吗? - salathe
1个回答

14

filter_var函数使用FILTER_SANITIZE_SPECIAL_CHARS选项时,会执行其预期的功能:

对HTML字符('"<>&)以及ASCII码小于32的字符进行转义、可选择地去除或编码其他特殊字符。

换行符(\n)的ASCII值小于32,因此将被转换为&#10;。你可以使用html_entity_decode将它们转换回原始字符:

$string = "line 1\nline 2";
$filtered = filter_var($string, FILTER_SANITIZE_SPECIAL_CHARS);
echo "$filtered\n";
echo(html_entity_decode($filtered));

输出:

line 1&#10;line 2
line 1
line 2

但我猜这样做会使使用 FILTER_SANITIZE_SPECIAL_CHARS 失去意义。

如果只有换行符导致问题,你可以在使用 nl2br() 之前,将 HTML 字符实体 (&#10;) 替换为换行符。

echo str_replace('&#10;', "\n", $filtered);

输出:

line 1
line 2

或者更好的方法是跳过中间步骤,用HTML字符实体(&#10;)替换为<br />


echo str_replace('&#10;', '<br />', $filtered);

输出:

line 1<br />line 2

但我并不完全确定您想做什么。


非常感谢!可以了!在发送请求之前我确实尝试过,但是方法不对;) 非常感谢。 - med87

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