get_html_translation_table

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

get_html_translation_table返回 htmlspecialchars()htmlentities() 使用的转换表

说明

get_html_translation_table(int $table = HTML_SPECIALCHARS, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, string $encoding = "UTF-8"): array

get_html_translation_table() 将返回在 htmlspecialchars()htmlentities() 内部使用的转换表。

注意:

特殊字符可以以多种方式编码。例如 " 可以编码为 ", "&#x22get_html_translation_table() 只返回 htmlspecialchars()htmlentities() 使用的形式。

参数

table

要返回的表。要么是 HTML_ENTITIES 要么是 HTML_SPECIALCHARS

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

要使用的编码。如果省略,此参数的默认值为 UTF-8。

支持以下字符集

支持的字符集
字符集 别名 说明
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())中按此顺序进行检测。不推荐。

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

返回值

以数组形式返回转换表,原始字符作为键,实体作为值。

变更日志

版本 说明
8.1.0 flagsENT_COMPAT 更改为 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401

范例

示例 #1 转换表示例

<?php
var_dump
(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES | ENT_HTML5));
?>

上面的示例将输出类似于以下内容

array(1510) {
  ["
"]=>
  string(9) "&NewLine;"
  ["!"]=>
  string(6) "&excl;"
  ["""]=>
  string(6) "&quot;"
  ["#"]=>
  string(5) "&num;"
  ["$"]=>
  string(8) "&dollar;"
  ["%"]=>
  string(8) "&percnt;"
  ["&"]=>
  string(5) "&amp;"
  ["'"]=>
  string(6) "&apos;"
  // ...
}

参见

添加笔记

用户贡献笔记 13 个笔记

michael dot genesis at gmail dot com
12 年前
MS-Word 和一些其他来源使用 CP-1252,而且它与 Latin1 ('ISO-8859-1') 很接近,这会导致很多混淆。最让我困惑的是发现 mySQL 默认使用 CP-1252。

如果你发现自己想做类似的事情,你可能会遇到麻烦
<?php
$trans
[chr(149)] = '&bull;'; // Bullet
$trans[chr(150)] = '&ndash;'; // En Dash
$trans[chr(151)] = '&mdash;'; // Em Dash
$trans[chr(152)] = '&tilde;'; // Small Tilde
$trans[chr(153)] = '&trade;'; // Trade Mark Sign
?>

不要这样做。不要这样做!

你可以使用
<?php
$translationTable
= get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'WINDOWS-1252');
?>

或者直接转换
<?php
$output
= htmlentities($input, ENT_NOQUOTES, 'WINDOWS-1252');
?>

但是你的网页可能是 UTF-8 编码的,而且你可能并不真正想要 CP-1252 文本到处飞,所以先修复字符编码
<?php
$output
= mb_convert_encoding($input, 'UTF-8', 'WINDOWS-1252');
$ouput = htmlentities($output);
?>
kevin at cwsmailbox dot xom
13 年前
在循环中使用 get_html_translation_table() 时要小心,因为它非常慢。
Kenneth Kin Lum
15 年前
为了在网页上显示映射,无论服务器编码是什么,都可以使用此方法

echo "<pre>\n";
echo htmlentities(print_r((get_html_translation_table(HTML_SPECIALCHARS)), true));
echo htmlentities(print_r((get_html_translation_table(HTML_ENTITIES)), true));

由于 get_html_translation_table() 实际上以 iso-8859-1 (Latin-1) 编码提供特殊字符,因此要正确查看表格,请使用

print_r(get_html_translation_table(HTML_ENTITIES));

您的服务器需要提供一个 HTTP 标头为 iso-8859-1,除非您使用 header() 或手动将浏览器的编码设置设置为 iso-8859-1。您需要查看页面的源代码以查看映射。(除了英语版本的 IE 7 以 iso-8859-1 方式输出页面源代码)。
dirk at hartmann dot net
23 年前
get_html_translation_table
它只适用于前 256 个代码位置。
对于更高的位置,例如 &#1092;
(一个西里尔字母)它显示相同。
iain (duh) workingsoftware.com.au
16 年前
我编写了一个快速的小函数,用于将类似 '&middot;' 的内容转换为 '&#183;'。

$to_convert = '&middot;';
$table = get_html_translation_table(HTML_ENTITIES);
$equiv = '&#'.ord(array_search($to_convert,$table)).';';
Jérôme Jaglale
17 年前
htmlentities 包含 htmlspecialchars,因此以下是将 UTF-8 字符串转换的方法
htmlentities($string, ENT_QUOTES, 'UTF-8');
Patrick nospam at nospam mesopia dot com
19 年前
我不确定这里发生了什么,但我遇到了其他人也可能遇到的问题...

<?php

$translations
= array_flip(get_html_translation_table(HTML_ENTITIES,ENT_QUOTES));

?>

将单引号 ' 等效于 &#39;,而

<?php

$translatedString
= htmlentities($string,ENT_QUOTES);

?>
将其等效于 &#039;

我目前不得不进行特定的字符串替换... 不确定是函数还是数组操作出了问题。

-Pat
Maurizio Siliani at trident dot it
17 年前
如果您(像我一样)在从用户从 Word 中复制粘贴的 ISO-8859-1 编码表单中获取数据时遇到问题,则此例程可能会有用。
它将 M$ Word 通常替换为键入文本的字符的代码添加到标准的 get_html_translation_table 中。
否则,这些字符将永远无法在 html 输出中正确显示。

function get_html_translation_table_CP1252() {
$trans = get_html_translation_table(HTML_ENTITIES);
$trans[chr(130)] = '&sbquo;'; // 单个低 9 引号
$trans[chr(131)] = '&fnof;'; // 拉丁小写字母 F 带钩
$trans[chr(132)] = '&bdquo;'; // 双低 9 引号
$trans[chr(133)] = '&hellip;'; // 水平省略号
$trans[chr(134)] = '&dagger;'; // 短剑
$trans[chr(135)] = '&Dagger;'; // 双短剑
$trans[chr(136)] = '&circ;'; // 修饰符字母插入符号重音
$trans[chr(137)] = '&permil;'; // 千分号
$trans[chr(138)] = '&Scaron;'; // 拉丁大写字母 S 带卡戎
$trans[chr(139)] = '&lsaquo;'; // 单个左向指向的角度引号
$trans[chr(140)] = '&OElig; '; // 拉丁大写字母连字 OE
$trans[chr(145)] = '&lsquo;'; // 左单引号
$trans[chr(146)] = '&rsquo;'; // 右单引号
$trans[chr(147)] = '&ldquo;'; // 左双引号
$trans[chr(148)] = '&rdquo;'; // 右双引号
$trans[chr(149)] = '&bull;'; // 项目符号
$trans[chr(150)] = '&ndash;'; // 短破折号
$trans[chr(151)] = '&mdash;'; // 长破折号
$trans[chr(152)] = '&tilde;'; // 小波浪号
$trans[chr(153)] = '&trade;'; // 商标符号
$trans[chr(154)] = '&scaron;'; // 拉丁小写字母 S 带卡戎
$trans[chr(155)] = '&rsaquo;'; // 单个右向指向的角度引号
$trans[chr(156)] = '&oelig;'; // 拉丁小写字母连字 OE
$trans[chr(159)] = '&Yuml;'; // 拉丁大写字母 Y 带分音符
ksort($trans);
return $trans;
}
kumar at chicagomodular.com
21 年前
如果没有严格的科学分析,这似乎可以作为一种快速修复方法,使源自 Microsoft Word 文档的文本显示为 HTML

<?php
function DoHTMLEntities ($string)
{
$trans_tbl = get_html_translation_table (HTML_ENTITIES);

// MS Word 奇怪的地方..
// 智能单引号/双引号:
$trans_tbl[chr(145)] = '\'';
$trans_tbl[chr(146)] = '\'';
$trans_tbl[chr(147)] = '&quot;';
$trans_tbl[chr(148)] = '&quot;';

// 锐音 'e'
$trans_tbl[chr(142)] = '&eacute;';

return
strtr ($string, $trans_tbl);
}
?>
Alex Minkoff
19 年前
如果您想在 Web 浏览器中显示特殊 HTML 实体,可以使用以下代码

<?
$entities = get_html_translation_table(HTML_ENTITIES);
foreach ($entities as $entity) {
$new_entities[$entity] = htmlspecialchars($entity);
}
echo "<pre>";
print_r($new_entities);
echo "</pre>";
?>

如果您没有这样做,每个元素的键名将看起来与元素内容本身相同,使其看起来非常愚蠢。;)
robertn972 at gmail dot com
16 年前
我发现这对转换拉丁字符很有用

<?php
function convertLatin1ToHtml($str) {
$allEntities = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES);
$specialEntities = get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES);
$noTags = array_diff($allEntities, $specialEntities);
$str = strtr($str, $noTags);
return
$str;
}
?>
kevin_bro at hostedstuff dot com
21 年前
Alans 的版本似乎无法正常工作。如果您遇到相同的问题,请考虑使用此略作修改的版本

function unhtmlentities ($string) {
$trans_tbl = get_html_translation_table (HTML_ENTITIES);
$trans_tbl = array_flip ($trans_tbl);
$ret = strtr ($string, $trans_tbl);
return preg_replace('/&#(\d+);/me',
"chr('\\1')",$ret);
}
alan at akbkhome dot com
22 年前
如果您想解码所有这些 &#123; 符号...

function unhtmlentities ($string) {
$trans_tbl = get_html_translation_table (HTML_ENTITIES);
$trans_tbl = array_flip ($trans_tbl);
$ret = strtr ($string, $trans_tbl);
return preg_replace('/\&\#([0-9]+)\;/me',
"chr('\\1')",$ret);
}
To Top