PHP html_entity_decode()函数对于数字实体60和62的异常处理

4

如何在使用PHP的html_entity_decode()函数时,对数字HTML实体60和62进行例外处理?

目前我的代码大致类似于以下内容:

$t = mysqli_real_escape_string($db,html_entity_decode($_POST['title'],ENT_COMPAT,'UTF-8'));

然而,如果我有一些编码后以脱字符的形式显示在内容中(就像您直接向客户端显示和符号一样),它们也会被编码,这导致了HTML格式不正确。因此,我需要做出某种例外,尽管我不确定如何做到这一点;使用临时占位符进行字符串替换?我相信有更好的方法。


1
“解码”发布的值的目的是什么?这样做似乎出了问题。通常,HTML输入字段不会对任何值进行“编码”。 - user2864740
我支持许多不同的非拉丁语言和客户端浏览器,PHP 和其他混合内容总是会利用每一个机会来破坏 HTML 实体,因此当页面被编辑时,我将所有 127 以上的字符转换为数字 HTML 实体,以保证它们的安全性...但是,将它们放入数据库时长度成为了一个问题,然而 SQL 正确地支持 Unicode/UTF-8,所以这是最后一步,以确保客户端看到客户端需要的内容。 :-) - John
我不认为html_entity_decode被设计来处理这种情况(或者能够正确地处理它)。 - user2864740
目标是否只是“允许人们使用类似HTML编码的方法输入文本实体”?(为什么他们要这样做,而不是使用自己的字符集,我不知道...但至少这足以缩小问题的范围,仍然从错误地应用全面的HTML解码开始。) - user2864740
1
此外,<> 最好称为尖括号^ 是一个脱字符(并且不受 HTML 编码或解码的影响)。 - user2864740
显示剩余4条评论
1个回答

1

鉴于这可能是一个XY问题,以下是暂定的答复:
在解析HTML实体后,您可以通过htmlspecialchars重新编码那些可能会破坏HTML结构的字符。

$t = mysqli_real_escape_string(
    $db,
    htmlspecialchars(
        html_entity_decode($_POST['title'],ENT_COMPAT,'UTF-8'),
        'UTF-8'
    )
);

我认为问题在于,PHP无法理解哪些脱字符应该被编码,哪些应该是实体。因此,除非有内置的异常或不同的函数可用,否则我应该创建自己的函数,在使用html_entity_decode()之前和之后进行字符串替换。 - John
或者你可以在输出时应用编码,而不是在存储值时应用。如果这对性能有负面影响 -> 缓存 ;-) - VolkerK
不幸的是,这对我来说是一个双重否定。虽然被编码为数字实体,但 SQL 字段的非常有意的限制(例如用于元描述)并不能弥补数字 HTML 实体的缺陷,而且我真的没有时间去调整它,更何况这几乎没有意义。此外,每次编辑器从可视模式切换到 HTML 模式时,JavaScript 都会将所有字符转换为实体,无论其代码是否超过 127。我没有看到我所希望的双字符串替换的替代方案;不过,我只想做我的客户想要的事情。 :-) - John
不不,我只是指编码,而不是解码:html_entity_decode() 不考虑 < 和/或 >,即将 < 和 > 保留为原样,但在外部应用 htmlspecialchars()。 - VolkerK
我尝试过这样做,它会从变量中删除字符串内容。:-\ - John
哦,JavaScript在我的系统上不编码插入符号,因为它们的编号是60和62,而且它只编码大于127的字符;该死,当使用拼写检查时,我无法忍受回车键触发创建注释。-__- - John

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