htmlentities

(PHP 4, PHP 5, PHP 7, PHP 8)

htmlentities将所有适用的字符转换为 HTML 实体

描述

htmlentities(
    字符串 $string,
    整数 $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
    ?字符串 $encoding = null,
    布尔值 $double_encode = true
): 字符串

此函数与 htmlspecialchars() 在所有方面都相同,只是使用 htmlentities(),所有具有 HTML 字符实体等效项的字符都将转换为这些实体。 get_html_translation_table() 函数可用于返回根据提供的 flags 常量使用的转换表。

如果您想进行解码(反向操作),则可以使用 html_entity_decode()

参数

string

输入字符串。

flags

一个或多个以下标志的位掩码,这些标志指定如何处理引号、无效代码单元序列和使用的文档类型。默认值为 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401

可用 flags 常量
常量名称 描述
ENT_COMPAT 将转换双引号并保留单引号。
ENT_QUOTES 将转换双引号和单引号。
ENT_NOQUOTES 将保留双引号和单引号。
ENT_IGNORE 静默丢弃无效代码单元序列,而不是返回空字符串。不建议使用此标志,因为它 » 可能存在安全隐患
ENT_SUBSTITUTE 将无效代码单元序列替换为 Unicode 替换字符 U+FFFD (UTF-8) 或 &#FFFD; (其他),而不是返回空字符串。
ENT_DISALLOWED 将给定文档类型的无效代码点替换为 Unicode 替换字符 U+FFFD (UTF-8) 或 &#FFFD; (其他),而不是保留原样。例如,这可能对确保包含嵌入式外部内容的 XML 文档的格式正确性很有用。
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 西欧,拉丁文-1。
ISO-8859-5 ISO8859-5 很少使用的西里尔字符集(拉丁文/西里尔文)。
ISO-8859-15 ISO8859-15 西欧,拉丁文-9。添加了欧元符号、拉丁文-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())的检测,按此顺序。不推荐。

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

double_encode

double_encode 关闭时,PHP 不会对现有的 html 实体进行编码。默认情况下,将转换所有内容。

返回值

返回编码后的字符串。

如果输入 string 在给定 encoding 中包含无效代码单元序列,则将返回空字符串,除非设置了 ENT_IGNOREENT_SUBSTITUTE 标志。

变更日志

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

示例

示例 #1 htmlentities() 示例

<?php
$str
= "A 'quote' is <b>bold</b>";

// 输出:A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

// 输出:A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);
?>

示例 #2 ENT_IGNORE 的用法

<?php
$str
= "\x8F!!!";

// 输出空字符串
echo htmlentities($str, ENT_QUOTES, "UTF-8");

// 输出 "!!!"
echo htmlentities($str, ENT_QUOTES | ENT_IGNORE, "UTF-8");
?>

参见

添加说明

用户贡献的说明 22 个说明

Sijmen Ruwhof
13 年前
下面是关于使用此函数来保护您的应用程序免受跨站点脚本 (XSS) 漏洞攻击的重要说明。

当在 HTML 标签的属性中打印用户输入时,htmlEntities() 的默认配置不能保护您免受 XSS 攻击,当使用单引号来定义标签属性值的边界时。通过注入单引号,就可以实现 XSS 攻击

<?php
$_GET
['a'] = "#000' onload='alert(document.cookie)";
?>

可能存在 XSS 攻击(不安全)

<?php
$href
= htmlEntities($_GET['a']);
print
"<body bgcolor='$href'>"; # 结果:<body bgcolor='#000' onload='alert(document.cookie)'>
?>

使用 'ENT_QUOTES' 引用样式选项,确保没有 XSS 漏洞,您的应用程序是安全的

<?php
$href
= htmlEntities($_GET['a'], ENT_QUOTES);
print
"<body bgcolor='$href'>"; # 结果:<body bgcolor='#000&#039; onload=&#039;alert(document.cookie)'>
?>

'ENT_QUOTES' 选项无法保护您免受某些标签属性(如 'a' 标签的 'href' 属性)中 JavaScript 评估的攻击。当您单击下面的链接时,将执行给定的 JavaScript 代码

<?php
$_GET
['a'] = 'javascript:alert(document.cookie)';
$href = htmlEntities($_GET['a'], ENT_QUOTES);
print
"<a href='$href'>link</a>"; # 结果:<a href='javascript:alert(document.cookie)'>link</a>
?>
j2teamnnl at gmail dot com
2 年前
上面的答案对于法语等多种语言不正确
我已经修正了
function xml_entities($strIn)
{
if (is_numeric($strIn)) {
return $strIn;
}
$strOut = null;

$arrStr = mb_str_split($strIn);
foreach ($arrStr as $char) {
$ord = mb_ord($char);

if (($ord > 0 && $ord < 32) || ($ord >= 127)) {
$strOut .= "&amp;#{$ord};";
}
else {
switch ($char) {
case '<'
$strOut .= '&lt;';
break;
case '>'
$strOut .= '&gt;';
break;
case '&'
$strOut .= '&amp;';
break;
case '"'
$strOut .= '&quot;';
break;
default
$strOut .= $char;
}
}
}

return $strOut;
}
q (dot) rendeiro (at) gmail (dot) com
17 年前
我见过很多将所有实体转换为命名实体的函数,但我需要在一个包含命名实体而不是数字实体(由 tinymce 编辑)的数据库字段中进行全文搜索,所以我搜索了 tinymce 源代码并找到一个包含值->实体映射的字符串。因此,我编写了以下函数来使用命名实体对用户的查询进行编码。

我使用的字符串与原始字符串不同,因为我不想转换 ' 或 "。字符串太长了,所以我不得不截断它。要获得原始字符串,请检查 TinyMCE 源代码并搜索 nbsp 或其他实体;)

<?php

$entities_unmatched
= explode(',', '160,nbsp,161,iexcl,162,cent, [...] ');
$even = 1;
foreach(
$entities_unmatched as $c) {
if(
$even) {
$ord = $c;
} else {
$entities_table[$ord] = $c;
}
$even = 1 - $even;
}

function
encode_named_entities($str) {
global
$entities_table;

$encoded_str = '';
for(
$i = 0; $i < strlen($str); $i++) {
$ent = @$entities_table[ord($str{$i})];
if(
$ent) {
$encoded_str .= "&$ent;";
} else {
$encoded_str .= $str{$i};
}
}
return
$encoded_str;
}

?>
2962051004 at qq dot com
5 年前
<?php

/**
* 将中文转为Html实体
* Convert Chinese in HTML to entity
* 作者 QiangGe
* 邮箱 [email protected]
*
*/

$str = <<<EOT
你好 world
EOT;

function
ChineseToEntity($str) {
return
preg_replace_callback(
'/[\x{4e00}-\x{9fa5}]/u', // utf-8
// '/[\x7f-\xff]+/', // 如果是 gb2312
function ($matches) {
$json = json_encode(array($matches[0]));
preg_match('/\[\"(.*)\"\]/', $json, $arr);
/*
* 通过json_encode函数将中文转为unicode
* 然后用正则取出unicode
* Turn the Chinese into Unicode through the json_encode function, then extract Unicode from regular.
* 我认为这个想法很巧妙。
*/
return '&#x'. str_replace('\\u', '', $arr[1]). ';';
},
$str
);
}

echo
ChineseToEntity($str);
// &#x4f60;&#x597d; world
phil at lavin dot me dot uk
14 年前
以下代码将使字符串完全安全地用于 XML

<?php
function philsXMLClean($strin) {
$strout = null;

for (
$i = 0; $i < strlen($strin); $i++) {
$ord = ord($strin[$i]);

if ((
$ord > 0 && $ord < 32) || ($ord >= 127)) {
$strout .= "&amp;#{$ord};";
}
else {
switch (
$strin[$i]) {
case
'<':
$strout .= '&lt;';
break;
case
'>':
$strout .= '&gt;';
break;
case
'&':
$strout .= '&amp;';
break;
case
'"':
$strout .= '&quot;';
break;
default:
$strout .= $strin[$i];
}
}
}

return
$strout;
}
?>
hajo-p
10 年前
ENT_HTML5 标志还会使用 htmlentities 剥离换行符,如 \n,而 htmlspecialchars 不会受到影响。

如果您想在之后对该字符串使用 nl2br,您可能会遇到像我一样的问题。这并不适用于其他标志,例如 ENT_XHTML,这让我感到困惑。

我在 PHP 5.4/5.5/5.6-dev 上测试了这一点,结果相同,因此似乎这是一个预期的“特性”。
realcj at g mail dt com
17 年前
如果您正在为 Flash 构建 loadvars 页面,并且遇到特殊字符(如 " & "," ' " 等)的问题,您应该为 Flash 对它们进行转义

在 Flash 的 ActionScript 中尝试 trace(escape("&")); 来查看 & 的转义代码;

% = %25
& = %26
' = %27

<?php
function flashentities($string){
return
str_replace(array("&","'"),array("%26","%27"),$string);
}
?>

这是让我最担心的两个字符。YMMV。
ustimenko dot alexander at gmail dot com
12 年前
对于那些想要在使用 htmlentities 后恢复其国家字母的西班牙人(不仅仅是西班牙人):)

<?php
protected function _decodeAccented($encodedValue, $options = array()) {
$options += array(
'quote' => ENT_NOQUOTES,
'encoding' => 'UTF-8',
);
return
preg_replace_callback(
'/&\w(acute|uml|tilde);/',
create_function(
'$m',
'return html_entity_decode($m[0], ' . $options['quote'] . ', "' .
$options['encoding'] . '");'
),
$encodedValue
);
}
?>
wd at NOSPAMwd dot it
12 年前
您好!

经过多次测试,我发现:

- 当您指定标志和字符集时,htmlentities() 函数会移除 "à"、"è" 等字符。

- 当您不指定任何内容时,htmlentities() 函数**不会**移除上述字符。

因此,假设我们有以下代码:

<?php

$str
= "Hèèèllooo";

$res_1 = htmlentities($str, ENT_QUOTES, "UTF-8");
$res_2 = htmlentities($str);

echo
var_dump($res_1); // 结果: string '' (length=0)
echo var_dump($res_2); // string 'H&egrave;&egrave;&egrave;llooo' (length=30)

?>

我将此用于评论的文本区域内容。不过需要注意的是,使用 "$res_2" 形式的函数会保留未转换的单引号或双引号。此时,您应该使用 str_replace() 函数来处理这些字符,但要注意以下情况:

<?php

$str
= "'Hèèèllooo'";

$res_2 = str_replace("'","&#039;",$str);
$res_2 = htmlentities($str);
echo
var_dump($res_2); // string '&amp;#039;H&egrave;&egrave;&egrave;llooo&amp;#039;'

$res_3 = htmlentities($str);
$res_3 = str_replace("'","&#039;",$res_3);
echo
var_dump($res_3); // string '&#039;H&egrave;&egrave;&egrave;llooo&#039;' --> 很好
?>

希望对您有所帮助。

此致敬礼,
W.D.
n at erui dot eu
12 年前
html entities 不会编码所有 Unicode 字符。它编码了它能编码的字符(所有拉丁 1 字符),其他的字符则会通过。我使用的是 &#1033;,它很讨厌。我一直在寻找能够编码所有字符的函数,但最终还是自己写了这个。这是我所能想到的最简单的实现方式。请查阅 ASCII 表,自定义包含/排除您想要/不想要的字符。我相信这个函数并不快。

// Unicode 防护 htmlentities。
// 将“正常”字符作为字符返回,并将奇怪字符作为数值型 HTML 实体返回。
function superentities( $str ){
// 移除现有的实体,否则会进行双重转义
$str = html_entity_decode(stripslashes($str),ENT_QUOTES,'UTF-8');
$ar = preg_split('/(?<!^)(?!$)/u', $str ); // 返回每个多字节字符的数组
foreach ($ar as $c){
$o = ord($c);
if ( (strlen($c) > 1) || /* 多字节 [unicode] */
($o <32 || $o > 126) || /* <- 控制字符 / 拉丁语中的怪字符 -> */
($o >33 && $o < 40) ||/* 引号 + 和号 */
($o >59 && $o < 63) /* html */
) {
// 转换为数值型实体
$c = mb_encode_numericentity($c,array (0x0, 0xffff, 0, 0xffff), 'UTF-8');
}
$str2 .= $c;
}
return $str2;
}
Bassie (:
21 年前
请注意,在使用任何其他编辑文本的函数(如 nl2br())之前,您需要使用 htmlentities()。

如果您先使用 nl2br(),则 htmlentities() 函数会将 < br > 更改为 &lt;br&gt;。
robin at robinwinslow dot co dot uk
13 年前
htmlentities 似乎在 5.1.6 和 5.3.3 版本之间发生了变化,现在对于包含磅符号的任何内容都会返回空字符串

$ php -v
PHP 5.1.6 (cli) (built: May 22 2008 09:08:44)
$ php -r "echo htmlentities('£hello', null, 'utf-8');"
&pound;hello
$

$ php -v
PHP 5.3.3 (cli) (built: Aug 19 2010 12:07:49)
$ php -r "echo htmlentities('£hello', null, 'utf-8');"
$

(第二次返回空字符串)

提醒一下。
Waygood
13 年前
将值放入注释标签 <!-- --> 时,您还应该将 -- 替换为 &#45;&#45;,因为这将结束您的标签并显示注释的其余部分。
admin at wapforum dot rs
13 年前
一个有用的函数,可以转换不同输入中的符号。
<?php
function ConvertSimbols($var, $ConvertQuotes = 0) {
if (
$ConvertQuotes > 0) {
$var = htmlentities($var, ENT_NOQUOTES, 'UTF-8');
$var = str_replace('\"', '', $var);
$var = str_replace("\'", '', $var);
} else {
$var = htmlentities($var, ENT_QUOTES, 'UTF-8');
}
return
$var;
}
?>

例如,包含引号的消息的用法

$message = ConvertSimbols($message);

例如,不包含引号的链接的用法

$link = ConvertSimbols($link, 1);
Jeff
6 年前
使用 AJAX 调用 PHP 向 XML 写入数据时,有一个很少被提到的功能。我花了几个小时使用 htmlentities(),因为写入 XML 文档的内容与预期不符。我自然地认为,在将字符串写入 XML 之前应该使用 htmlentities() 或 htmlspecialchars() 转换它们,以遵守 XML 关于非法字符的规则。令我惊讶的是,当使用 htmlentities() 或 htmlspecialchars() 转换字符串后写入 XML 文件时,生成的和号会在之后被转换!请考虑以下示例

<?php
$str
= "<b>I am cool</b>" ;
$str = htmlentities($str) ;
?>

当您将 $str 追加到 XML 元素并保存() 文档时,您会希望 XML 文档的源代码看起来像这样

<ele>&lt;b&gt;I am cool&lt;/b&gt;</ele>

但实际情况并非如此。PHP 会自动将生成的和号转换为 &amp;,最终的源代码看起来像这样

<ele>&amp;lt;b&amp;gt;I am cool&amp;lt;/b&amp;gt;</ele>

正如您所看到的,这在尝试将 XML 数据输出回 HTML 时会造成问题。重要的是要记住,以这种方式写入 XML 时,PHP 会自动转换特殊字符,例如“>”和“<”;在某些情况下,不需要使用 htmlentities()。我假设此功能是为了帮助通过标题查询传递数据而存在的,以避免保留字符与标题查询中的其他字符冲突(例如,& 或 =)。现在我理解这可能不适用于旧版本的 PHP,并且这可能是我的版本(PHP 版本 5.6.32)的一个功能。在旧版本中,我假设使用 htmlentities() 或 htmlspecialchars() 是必须的,正如这里之前的说明中所述。此外,我在 HTML 和 XML 中使用字符集 UTF-8,我不确定这是否也会影响我得到的结果。

无论如何,我花了几个小时使用 htmlentities() 转换字符串以用于 XML 写入和保存,而我只需要不做任何转换,让 PHP 自动为我转换字符串就可以了。我希望这能有所帮助,因为我想我不止一个人遇到过这种情况。
Tom Walter
15 年前
请注意,从 5.2.5 版本开始,如果输入字符串包含对您指定的输出编码无效的字符,则此函数将返回 null。

您可能希望它只是删除无效字符,但它不会这样做。

您可以自己删除字符,方法如下

iconv('utf-8','utf-8',$str);

您也可以将它与 htmlentities 结合使用

$str = htmlentities(iconv('UTF-8', 'UTF-8//IGNORE', $str, ENT_QUOTES, 'UTF-8');

这应该会为您提供一个包含 htmlentities 编码为 utf-8 的字符串,以及删除的所有不支持的字符。
jake_mcmahon at hotmail dot com
20 年前
此函数在对抗 XSS(跨站点脚本)方面特别有用。XSS 利用代码中的漏洞,无论是 JavaScript 还是 PHP。XSS 通常(如果不是总是)使用 HTML 实体来执行其恶意行为,因此此函数与您的脚本(尤其是搜索或提交脚本)协同工作是抗击“H4X0rz”的非常有用的工具。
steve at mcdragonsoftware dot com
12 年前
我很高兴 5.4 版本支持 XML,但我们中的许多人仍在使用旧版本,有些人仍在使用 PHP4。如果您像我一样,您一定对尝试使用 htmlentites/htmlspecial chars 与 XML 输出感到沮丧。我希望能找到一个选项来强制使用数字编码,但缺少这个选项,我编写了自己的 xmlencode 函数,现在我提供给大家

用法

$string xmlencode( $string )

它将使用 htmlspecialchars 针对有效的 XML 实体 amp、quote、lt、gt、(apos) 进行处理,并返回所有其他非字母数字字符的数字实体。

-------------------------------------------

<?php
if( !function_exists( 'xmlentities' ) ) {
function
xmlentities( $string ) {
$not_in_list = "A-Z0-9a-z\s_-";
return
preg_replace_callback( "/[^{$not_in_list}]/" , 'get_xml_entity_at_index_0' , $string );
}
function
get_xml_entity_at_index_0( $CHAR ) {
if( !
is_string( $CHAR[0] ) || ( strlen( $CHAR[0] ) > 1 ) ) {
die(
"function: 'get_xml_entity_at_index_0' requires data type: 'char' (single character). '{$CHAR[0]}' does not match this type." );
}
switch(
$CHAR[0] ) {
case
"'": case '"': case '&': case '<': case '>':
return
htmlspecialchars( $CHAR[0], ENT_QUOTES ); break;
default:
return
numeric_entity_4_char($CHAR[0]); break;
}
}
function
numeric_entity_4_char( $char ) {
return
"&#".str_pad(ord($char), 3, '0', STR_PAD_LEFT).";";
}
}
?>
h_guillaume at hotmail dot com
13 年前
我使用此函数来对所有 XML 实体进行编码,也对 XML 中未定义的 &something; 进行编码,例如 &trade;。
您也可以使用我的解码函数解码您编码的内容。
我的函数与 htmlentities 类似。
您也可以在需要从编码中排除时,将其他字符串添加到数组中。

<?php
function xml_entity_decode($text, $charset = 'Windows-1252'){
// 双重解码,这样如果值为 &amp;trade;,它将变为 Trademark
$text = html_entity_decode($text, ENT_COMPAT, $charset);
$text = html_entity_decode($text, ENT_COMPAT, $charset);
return
$text;
}

function
xml_entities($text, $charset = 'Windows-1252'){
// 调试和测试
// $text = "test &amp; &trade; &amp;trade; abc &reg; &amp;reg; &#45;";

// 首先,我们对在 XML 中也无效的 HTML 字符进行编码
$text = htmlentities($text, ENT_COMPAT, $charset, false);

// 来自维基的 XML 字符实体数组
// 注意:&apos; 在 UTF-8 或 UTF-16 中是无用的
$arr_xml_special_char = array("&quot;","&amp;","&apos;","&lt;","&gt;");

// 构建正则表达式字符串以排除所有包含 XML 特殊字符的字符串
$arr_xml_special_char_regex = "(?";
foreach(
$arr_xml_special_char as $key => $value){
$arr_xml_special_char_regex .= "(?!$value)";
}
$arr_xml_special_char_regex .= ")";

// 扫描数组以查找 &something_not_xml; 语法
$pattern = "/$arr_xml_special_char_regex&([a-zA-Z0-9]+;)/";

// 将 &something_not_xml; 替换为 &amp;something_not_xml;
$replacement = '&amp;${1}';
return
preg_replace($pattern, $replacement, $text);
}
?>
za at byza dot it
16 年前
使用不同字符集的文件时遇到问题?

htmlentities 和 html_entity_decode 可用于在字符集之间进行转换!

示例函数

<?php
function utf2latin($text) {
$text=htmlentities($text,ENT_COMPAT,'UTF-8');
return
html_entity_decode($text,ENT_COMPAT,'ISO-8859-1');
}
?>
chris at ocproducts dot com
7 年前
即使设置了 ENT_SUBSTITUTE,此函数也会在输入错误时抛出警告,因此请做好准备。
drallen at cs dot uwaterloo dot ca
13 年前
如果您打算将字符集中的 *所有* 字符转换为其对应的 HTML 实体,而不是仅仅是命名字符,那么请参考 https://php.net/manual/en/function.mb-convert-encoding.php。未命名的字符将被替换为 HTML 数字编码。例如:

$text = mb_convert_encoding($text, 'HTML-ENTITIES', "UTF-8");
To Top