PHP 日本大会 2024

html_entity_decode

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

html_entity_decode将 HTML 实体转换为相应的字符

描述

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

html_entity_decode()htmlentities() 相反,它将 string 中的 HTML 实体转换为相应的字符。

更准确地说,此函数解码所有实体(包括所有数字实体),这些实体 a) 对于所选文档类型必须有效——例如,对于 XML,此函数不解码可能在某个 DTD 中定义的命名实体——并且 b) 其字符或字符位于与所选编码关联的编码字符集中,并且在所选文档类型中允许。所有其他实体保持不变。

参数

string

输入字符串。

flags

一个或多个以下标志的位掩码,这些标志指定如何处理引号以及使用哪个文档类型。默认值为 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401

可用的 flags 常量
常量名称 描述
ENT_COMPAT 将转换双引号,而保留单引号。
ENT_QUOTES 将转换双引号和单引号。
ENT_NOQUOTES 将保留双引号和单引号。
ENT_SUBSTITUTE 用 Unicode 替换字符 U+FFFD (UTF-8) 或 � (其他) 替换无效的代码单元序列,而不是返回空字符串。
ENT_HTML401 将代码处理为 HTML 4.01。
ENT_XML1 将代码处理为 XML 1。
ENT_XHTML 将代码处理为 XHTML。
ENT_HTML5 将代码处理为 HTML 5。

encoding

一个可选参数,定义转换字符时使用的编码。

如果省略,encoding 默认值为 default_charset 配置选项的值。

虽然此参数在技术上是可选的,但如果 default_charset 配置选项可能针对给定输入设置不正确,则强烈建议您为代码指定正确的值。

支持以下字符集

支持的字符集
字符集 别名 描述
ISO-8859-1 ISO8859-1 西欧语言,Latin-1。
ISO-8859-5 ISO8859-5 很少使用的西里尔字母字符集(Latin/Cyrillic)。
ISO-8859-15 ISO8859-15 西欧语言,Latin-9。添加了 Latin-1 (ISO-8859-1) 中缺少的欧元符号、法语和芬兰语字母。
UTF-8   与 ASCII 兼容的多字节 8 位 Unicode。
cp866 ibm866, 866 DOS 特定的西里尔字母字符集。
cp1251 Windows-1251, win-1251, 1251 Windows 特定的西里尔字母字符集。
cp1252 Windows-1252, 1252 Windows 特定的西欧语言字符集。
KOI8-R koi8-ru, koi8r 俄语。
BIG5 950 繁体中文,主要用于台湾。
GB2312 936 简体中文,国家标准字符集。
BIG5-HKSCS   带有香港扩展的 Big5,繁体中文。
Shift_JIS SJIS, SJIS-win, cp932, 932 日语
EUC-JP EUCJP, eucJP-win 日语
MacRoman   Mac OS 使用的字符集。
''   空字符串将依次从脚本编码 (Zend 多字节)、default_charset 和当前区域设置 (参见 nl_langinfo()setlocale()) 中进行检测。不推荐。

注意: 任何其他字符集都无法识别。将使用默认编码,并将发出警告。

返回值

返回解码后的字符串。

变更日志

版本 描述
8.1.0 flagsENT_COMPAT 更改为 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401
8.0.0 encoding 现在可以为空。

示例

示例 #1 解码 HTML 实体

<?php
$orig
= "I'll \"walk\" the <b>dog</b> now";

$a = htmlentities($orig);

$b = html_entity_decode($a);

echo
$a; // I'll &quot;walk&quot; the &lt;b&gt;dog&lt;/b&gt; now

echo $b; // I'll "walk" the <b>dog</b> now
?>

注释

注释:

您可能想知道为什么 trim(html_entity_decode('&nbsp;')); 没有将字符串缩减为空字符串,这是因为 '&nbsp;' 实体不是 ASCII 码 32(由 trim() 去除),而是在默认 ISO 8859-1 编码中是 ASCII 码 160 (0xa0)。

参见

添加注释

用户贡献的注释 5 条注释

Martin
13 年前
如果您需要将 &#[0-9]+ 实体转换为 UTF-8 的功能,这个简单的方法有效

<?php
/* 实体处理。 /
$input = "Fovi&#269;";

$output = preg_replace_callback("/(&#[0-9]+;)/", function($m) { return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); }, $input);

/* 纯 UTF-8。 */
echo $output;
?>
txnull
9 年前
使用以下方法解码所有实体
<?php html_entity_decode($string, ENT_QUOTES | ENT_XML1, 'UTF-8') ?>

我已经检查了这些特殊实体
- 双引号 (&#34;)
- 单引号 (&#39; 和 &apos;)
- 不可打印字符(例如 &#13;)
使用其他 $flags,某些或所有实体将不会被解码。

解码时,ENT_XML1 和 ENT_XHTML 看起来是相同的。
aidan at php dot net
20 年前
此功能现在已在 PEAR 包 PHP_Compat 中实现。

有关在不升级 PHP 版本的情况下使用此函数的更多信息,请参见以下链接

http://pear.php.net/package/PHP_Compat
Benjamin
11 年前
以下函数解码命名和数字 HTML 实体,并在 UTF-8 上运行。需要 iconv。

function decodeHtmlEnt($str) {
$ret = html_entity_decode($str, ENT_COMPAT, 'UTF-8');
$p2 = -1;
for(;;) {
$p = strpos($ret, '&#', $p2+1);
if ($p === FALSE)
break;
$p2 = strpos($ret, ';', $p);
if ($p2 === FALSE)
break;

如果 (substr($ret, $p+2, 1) == 'x')
$char = hexdec(substr($ret, $p+3, $p2-$p-3));
否则
$char = intval(substr($ret, $p+2, $p2-$p-2));

//echo "$char\n";
$newchar = iconv(
'UCS-4', 'UTF-8',
chr(($char>>24)&0xFF).chr(($char>>16)&0xFF).chr(($char>>8)&0xFF).chr($char&0xFF)
);
//echo "$newchar<$p<$p2<<\n";
$ret = substr_replace($ret, $newchar, $p, 1+$p2-$p);
$p2 = $p + strlen($newchar);
}
返回 $ret;
}
Daniel A.
6年前
我今天想使用这个函数,但我发现文档,特别是关于标志的部分,帮助不大。

例如,运行下面的代码失败了,因为我使用的标志错误……

$string = 'Donna&#039;s Bakery';
$title = html_entity_decode($string, ENT_HTML401, 'UTF-8');
echo $title;

在这种情况下,应该使用正确的标志 ENT_QUOTES。

我对要使用的标志的理解是,它应该与预期的转换结果相对应。因此,对于转换后将成为单引号或双引号的字符,使用 ENT_QUOTES……等等。

请帮助使文档更清晰一些。
To Top