← PHP htmlentities()函数:字符转HTML实体教程 PHP htmlspecialchars()函数:特殊字符转HTML实体教程 →

PHP html_entity_decode()函数:HTML实体还原字符教程

著
原创 2026-10-10 PHP 已有人查阅

一、函数定位与核心作用

html_entity_decode()是PHP的字符串处理函数,负责把HTML实体还原成对应的字符。它是htmlentities()的逆操作:一个把字符转成实体,一个把实体还原成字符。

实际项目里,这个函数常出现在数据清洗环节。比如从旧系统、第三方接口或爬虫抓取的内容里,字符串可能已经被转义成<、&、"这类形式。要正常展示或做文本比对,就得先解码回原始字符。

函数签名:

html_entity_decode(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ?string $encoding = null): string

三个参数中,只有$string必填。

需要区分它和htmlspecialchars_decode():后者只还原htmlspecialchars()转义的少数几个字符,范围窄;html_entity_decode()能处理更广泛的实体,包括数字实体如中和命名实体如©。

二、参数逐项拆解

string(必填)

待解码的字符串。里面包含一个或多个HTML实体,函数会把这些实体替换回字符。

flags(可选)

控制引号处理方式和文档类型。引号相关常量:

  • ENT_COMPAT:只解码双引号实体",保留单引号实体'。

  • ENT_QUOTES:同时解码双引号和单引号实体。

  • ENT_NOQUOTES:两者都不解码。

文档类型相关常量:

  • ENT_HTML401:按HTML4.01规则处理。

  • ENT_HTML5:按HTML5规则处理,支持更多命名实体。

  • ENT_XHTML、ENT_XML1:按XHTML或XML规则处理。

character-set(可选)

指定字符集,如UTF-8、ISO-8859-1。省略时使用PHP默认字符集。处理中文实体时,这个参数影响很大。

三、编程示例

先看基础解码,把一段被转义的HTML还原:

<?php
$str = '&lt;a href=&quot;https://www.ebingou.cn&quot;&gt;代码号学习编程&lt;/a&gt;';
echo html_entity_decode($str);
?>

输出:

<a href="https://www.ebingou.cn">代码号学习编程</a>

实体还原后,如果直接输出到页面,浏览器会把它解析成真正的链接。这也是为什么解码后的内容不能随意回显给用户,存在XSS风险。

再看引号处理差异:

<?php
$str = "Hello PHP : &quot;E=MC2&quot; and &#039;code&#039;";

echo html_entity_decode($str, ENT_COMPAT);
echo "<br>";
echo html_entity_decode($str, ENT_QUOTES);
echo "<br>";
echo html_entity_decode($str, ENT_NOQUOTES);
?>

输出:

Hello PHP : "E=MC2" and &#039;code&#039;
Hello PHP : "E=MC2" and 'code'
Hello PHP : &quot;E=MC2&quot; and &#039;code&#039;

ENT_COMPAT只动双引号,单引号实体保留;ENT_QUOTES两者都还原;ENT_NOQUOTES两者都不动。

中文实体解码需要指定字符集:

<?php
$str = "&#32534;&#31243;&#23398;&#20064; &amp; &#20195;&#30721;&#21495;";
echo html_entity_decode($str, ENT_QUOTES, "UTF-8");
?>

输出:

编程学习 & 代码号

数字实体在UTF-8下被正确还原成中文。如果字符集不匹配,可能得到乱码或问号。

四、get_html_translation_table翻译表

get_html_translation_table()返回实体与字符的映射表,配合html_entity_decode()理解解码过程很直观。

<?php
print_r(get_html_translation_table(HTML_SPECIALCHARS));
?>

输出:

Array
(
    ["] => "
    [&] => &
    [<] => <
    [>] => >
)

这张表说明HTML_SPECIALCHARS模式下,只有四个字符有对应实体。实际调用html_entity_decode()时,函数内部会查类似的表,把实体替换成对应字符。

如果换成HTML_ENTITIES,表会大很多,包含&copy;、&nbsp;等命名实体。这也解释了为什么html_entity_decode()的解码范围比htmlspecialchars_decode()广。

五、项目反思与踩坑经历

踩坑一:解码后直接输出导致XSS

做一个后台评论管理功能时,为了把用户提交的&lt;script&gt;还原显示,直接html_entity_decode()后echo。结果页面弹窗执行了脚本。原因是解码把实体变回了<script>标签,浏览器当代码执行了。正确做法是:解码用于数据处理或比对,输出时再转义;如果确实要展示原始内容,解码后必须重新htmlspecialchars()。

踩坑二:重复解码破坏数据

数据从接口拿回来后,同事写了两处html_entity_decode(),一处清洗一处输出。结果&amp;lt;被解成<,原本想展示的实体文本变成了标签。解码次数要控制,明确在哪一层做,不要重复调用。

踩坑三:字符集不写导致中文乱码

处理爬虫抓取的中文实体时,只写html_entity_decode($str),部分内容出现乱码。原因是默认字符集不是UTF-8。改成html_entity_decode($str,ENT_QUOTES,'UTF-8')后正常。中文场景把字符集写全,能省很多排查时间。

个人建议

  • 解码和输出转义是两个方向的操作,不要混在一起。存原始数据,输出时按上下文转义。

  • 从外部来的实体字符串,解码前先确认来源可信,解码后按不可信内容处理。

  • 只在需要文本比对、字数统计、搜索匹配时解码,展示环节谨慎使用。

  • 富文本内容不要整体解码后直接入库,容易引入标签。

六、本节课程知识要点

  • html_entity_decode()把HTML实体还原成字符,是htmlentities()的逆操作。

  • 三个参数:字符串、flags、字符集,仅字符串必填。

  • ENT_COMPAT解双引号,ENT_QUOTES解双引号和单引号,ENT_NOQUOTES都不解。

  • 中文场景显式指定UTF-8,避免乱码。

  • get_html_translation_table()可查看实体与字符的映射关系。

  • 解码范围比htmlspecialchars_decode()广,支持数字实体和命名实体。

  • 解码后内容视为不可信,输出前需重新转义。

七、扩展应用场景

场景一:清洗爬虫数据

抓取的网页标题常含&amp;、&#8217;等实体。用html_entity_decode()还原后再做关键词匹配,统计结果更准确。

场景二:处理旧系统迁移数据

老系统把内容实体化后存库,迁移到新系统时需要批量解码。可以在脚本里对指定字段统一调用,再按新规则重新入库。

场景三:解析RSS与XML内容

订阅源里的描述字段常带实体。解析后先html_entity_decode(),再做摘要截取,避免实体字符占字数或切断错误。

场景四:搜索匹配

用户搜索C++&STL,数据库里存的是C++&amp;STL。搜索前对关键词和内容做统一解码,能提高命中率。

html_entity_decode()解决的是实体还原问题,看起来简单,用错场景却容易出安全问题。它的定位是数据处理工具,不是输出工具。理解flags对引号的控制、字符集对中文的影响,以及它与htmlspecialchars_decode()的范围差异,才能在清洗、比对、迁移这些环节用对。项目里记住一条:解码后的内容按不可信处理,输出该转义还得转义。

← PHP htmlentities()函数:字符转HTML实体教程 PHP htmlspecialchars()函数:特殊字符转HTML实体教程 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号