2024 年日本 PHP 研討會

html_entity_decode

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

html_entity_decode將 HTML 實體轉換為其對應的字元

說明

html_entity_decode(字串 $string, 整數 $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ?字串 $encoding = null): 字串

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 很少使用的斯拉夫字母字元集(拉丁/斯拉夫字母)。
ISO-8859-15 ISO8859-15 西歐語系,Latin-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 flags 已從 ENT_COMPAT 改為 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401
8.0.0 encoding 現在可以為 null。

範例

範例 #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;' 實體在預設的 ISO 8859-1 編碼中不是 ASCII 碼 32(會被 trim() 移除),而是 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;

if (substr($ret, $p+2, 1) == 'x')
$char = hexdec(substr($ret, $p+3, $p2-$p-3));
else
$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);
}
return $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