你究竟是如何测试它的?
<?php
//sanitize data from db before displaying on webpage
function htmlsan($htmlsanitize){
return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
var_dump(htmlsan('<>\'"'));
... 印刷:
string(20) "<>'""
我的猜测是您的输入字符串来自 Microsoft Word 并包含印刷引号:
var_dump(htmlsan('“foo”')); // string(9) "“foo”"
如果您出于某种原因确实需要转换它们,您需要htmlentities()
而不是htmlspecialchars()
:
var_dump(htmlentities('“foo”', ENT_QUOTES, 'UTF-8')); // string(17) "“foo”"
更新#1
好吧,是时候进行一些适当的测试了。在数据库字段中键入单引号 ( '
)comment
并在检索时运行以下代码:
var_dump(bin2hex("'"));
var_dump(htmlspecialchars("'", ENT_QUOTES, 'UTF-8'));
var_dump(bin2hex($row['comment']));
var_dump(htmlspecialchars($row['comment'], ENT_QUOTES, 'UTF-8'));
它应该打印这个:
string(2) "27"
string(6) "'"
string(2) "27"
string(6) "'"
请更新您的问题并确认您是否运行了此测试并得到相同或不同的输出。
更新#2
请仔细查看您声称获得的输出:
string(6) "'"
这不是一个有 6 个字符的字符串。您不是在查看真正的输出:您正在查看由浏览器呈现的输出。我很确定你得到了预期的结果,即string(6) "'"
. 如果您'
使用 Web 浏览器进行渲染,它将变为'
. 使用浏览器中的“查看源代码”菜单查看实际输出。