有换行符的FILTER_SANITIZE_SPECIAL_CHARS问题

时间:2010-06-30 14:51:43

标签: php filter

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

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

请帮忙。

谢谢:)

1 个答案:

答案 0 :(得分:13)

带有FILTER_SANITIZE_SPECIAL_CHARS选项的

filter_var正在执行它应该执行的操作:

  

HTML-escape'“<>&和字符   ASCII值小于32,可选   剥离或编码其他特殊的   字符。

换行符(\n)的ASCII值小于32,因此将转换为
。因此,您可以使用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
line 2
line 1
line 2

但我认为这首先打败了使用FILTER_SANITIZE_SPECIAL_CHARS的目标。

如果只是导致问题的换行符,则可以在使用
之前用换行符替换HTML字符实体(nl2br()):

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

输出:

line 1
line 2

或者甚至更好,跳过中间步骤,并用&#10;替换HTML字符实体(<br />):

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

输出:

line 1<br />line 2

...但我不是100%确定你想要做什么。