htmlspecialchars_decode

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

htmlspecialchars_decode将特殊的 HTML 实体转换回字符

描述

htmlspecialchars_decode(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401): string

此函数是 htmlspecialchars() 的反函数。它将特殊的 HTML 实体转换回字符。

转换的实体为:&"(当 ENT_NOQUOTES 未设置时)、'(当 ENT_QUOTES 设置时)、<>

参数

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。

返回值

返回解码后的字符串。

变更日志

版本 描述
8.1.0 flagsENT_COMPAT 更改为 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401

范例

范例 #1 一个 htmlspecialchars_decode() 的例子

<?php
$str
= "<p>this -&gt; &quot;</p>\n";

echo
htmlspecialchars_decode($str);

// 注意这里引号没有被转换
echo htmlspecialchars_decode($str, ENT_NOQUOTES);
?>

上面示例的输出结果为

<p>this -> "</p>
<p>this -> &quot;</p>

参见

添加笔记

用户贡献的笔记 8 个笔记

thomas at xci[ignore_this]teit dot commm
16 年前
下面 "htmlspecialchars_decode()" 的示例不幸的是不适用于所有 PHP4 版本。

来自 PHP 手册的引用
"get_html_translation_table() 将返回在 htmlspecialchars() 和 htmlentities() 内部使用的转换表。"

但事实并非如此!至少对于 PHP 版本 4.4.2 不是这样。
这已经在 bug 报告中被报道 (http://bugs.php.net/bug.php?id=25927),但被标记为 BOGUS。

证明
代码
--------------------
<?php
var_dump
(get_html_translation_table(HTML_SPECIALCHARS,ENT_QUOTES));
var_dump(htmlspecialchars('\'',ENT_QUOTES));
?>
--------------------

输出
--------------------
array
'"' => '&quot;'
''' => '&#39;'
'<' => '&lt;'
'>' => '&gt;'
'&' => '&amp;'

'&#039;'
--------------------

此注释不是为了再次报告此错误(虽然我确实认为这是一个错误),而是为了补充示例并提醒人们注意这个陷阱。

为了确保你的 PHP4 的 htmlspecialchars_decode 伪造可以工作,你应该做一些类似的事情

<?php
function htmlspecialchars_decode($string,$style=ENT_COMPAT)
{
$translation = array_flip(get_html_translation_table(HTML_SPECIALCHARS,$style));
if(
$style === ENT_QUOTES){ $translation['&#039;'] = '\''; }
return
strtr($string,$translation);
}
?>

Br, Thomas
匿名
17 年前
这应该是最好的方法。
(重新发布,因为另一个似乎有点慢,并且因为那些在调用它的人称它为 htmlspecialchars_decode_php4)

<?php

if ( !function_exists('htmlspecialchars_decode') )
{
function
htmlspecialchars_decode($text)
{
return
strtr($text, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
}
}

?>
or-k at or-k dot com
18 年前
它也适用于 &auml; 和 &quot; 等等。
get_html_translation_table(HTML_ENTITIES) => 提供比 HTML_SPECIALCHARS 更多的字符

function htmlspecialchars_decode_PHP4($uSTR)
{
return strtr($uSTR, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));
}
pinkgothic at gmail dot com
14 年前
请记住,你永远不应该信任用户输入 - 特别是对于包含纯文本和标记或脚本代码的混合输入。

为什么?

好吧,考虑一下有人向你的 PHP 脚本发送 '&amp;<script>alert('XSS');</script>'

<?php
$var
= "&amp;<script>alert('XSS');</script>";
$var = (htmlspecialchars_decode($var) == $var) ? htmlspecialchars($var) : $var;
echo
$var;
?>

由于 '&amp;' 解码为 '&',(htmlspecialchars_decode($var) == $var) 将为 -false-,因此返回 $var 而不进行转义。结果,脚本标签未被触碰,你刚刚让自己暴露于 XSS 攻击。

不幸的是,在我所知的情况下,没有可靠的方法来确定 HTML 是否已转义,而不会出现这个我所知道的缺点。与其尝试捕获 "我已经编码了这个" 的情况,不如通过尽可能靠近实际输出位置转义 HTML 来避免双重转义,例如在 MVC 开发结构中的视图中。
geoffers@gmail
19 年前
[先前笔记的更新,注意到我忘记了将引号样式添加进来]

PHP4 兼容函数

<?php

function htmlspecialchars_decode_php4 ($str, $quote_style = ENT_COMPAT) {
return
strtr($str, array_flip(get_html_translation_table(HTML_SPECIALCHARS, $quote_style)));
}

?>
benharold at mac dot com
15 年前
如果你使用 `htmlspecialchars()` 将像 & 这样的符号转换为它的 HTML 等价物 &amp;,你可能会遇到一个情况,你错误地将相同的字符串两次传递给该函数,导致你的网站上出现这样的情况,我称之为带符号的 & “&amp;” 。 显然没有人希望在应该只有一个 & 的网页上出现 “&amp;” 。 这里有一个快速简单的技巧,确保这种情况不会发生

<?php

$var
= "This is a string that could be passed to htmlspecialchars multiple times.";

if (
htmlspecialchars_decode($var) == $var) {
$var = htmlspecialchars($var);
}

echo
$var;

?>

现在,如果你处理的是混合文本(包含 HTML 实体和非 HTML 实体),你就需要自己处理了。
geoffers at gmail dot com
19 年前
为了 PHP4 兼容性

<?php

function htmlspecialchars_decode_php4 ($str) {
return
strtr($str, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
}

?>
benharold at mac dot com
15 年前
或者当然也可以

<?php

$var
= "Blue & yellow make green.";

$var = (htmlspecialchars_decode($var) == $var) ? htmlspecialchars($var) : $var;
echo
$var; // outputs Blue &amp; yellow make green.

// you can do it a bunch of times, it still won't screw you!

$var = (htmlspecialchars_decode($var) == $var) ? htmlspecialchars($var) : $var;
$var = (htmlspecialchars_decode($var) == $var) ? htmlspecialchars($var) : $var;
echo
$var; // still outputs Blue &amp; yellow make green.

?>

把它放到一个函数中。把它添加到某个抽象数据类的某个方法中。
To Top