PHP Conference Japan 2024

htmlspecialchars_decode

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

htmlspecialchars_decode將特殊的 HTML 實體轉換回字元

說明

htmlspecialchars_decode(字串 $string, 整數 $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401): 字串

此函式與 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>

參見

新增註釋

使用者提供的註釋 3 則註釋

thomas at xci[ignore_this]teit dot commm
16 年前
底下的 "htmlspecialchars_decode()" 範例很遺憾地並不能在所有 PHP4 版本上運作。

引用自 PHP 手冊
「get_html_translation_table() 會回傳 htmlspecialchars() 和 htmlentities() 內部使用的轉換表。」

但它並不會!至少在 PHP 4.4.2 版本不會。
這已經在錯誤報告中被提出(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));
?>
--------------------

輸出
--------------------
陣列
'"' => '&quot;'
''' => '&#39;'
'<' => '&lt;'
'>' => '&gt;'
'&' => '&amp;'

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

這則留言並不是要再次報告這個錯誤(雖然我確實認為它是一個錯誤),而是要補完這個範例並警告大家這個陷阱。

為了確保你的 htmlspecialchars_decode 在 PHP4 上的模擬版本可以正常運作,你應該這樣做

<?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
匿名
18 年前
這應該是最好的做法。
(重新發布,因為之前的版本似乎有點慢,而且使用底下程式碼的人將其命名為 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
19 年前
這也適用於 &auml; 和 &quot; 等等。
get_html_translation_table(HTML_ENTITIES) => 提供比 HTML_SPECIALCHARS 更多的字元

函式 htmlspecialchars_decode_PHP4($uSTR)
{
回傳 strtr($uSTR, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));
}
To Top