htmlentities和htmlspecialchars 的區(qū)別詳解
Mar 16, 2017 pm 02:57 PM很多人都以為htmlentities跟htmlspecialchars的功能是一樣的,都是格式化html代碼的,我以前也曾這么認為,但是今天我發(fā)現(xiàn)并不是這樣的。
The translations performed are:
代碼如下:
'&' (ampersand) becomes '&' '"' (double quote) becomes '"' when ENT_NOQUOTES is not set. ''' (single quote) becomes ''' only when ENT_QUOTES is set. '<' (less than) becomes '<' '>' (greater than) becomes '>'
htmlspecialchars 只轉(zhuǎn)化上面這幾個html代碼,而 htmlentities 卻會轉(zhuǎn)化所有的html代碼,連同里面的它無法識別的中文字符也給轉(zhuǎn)化了。 我們可以拿一個簡單的例子來做比較:
代碼如下:
$str='<a href="test.html">測試頁面</a>'; echo htmlentities($str); // <a href="test.html">2aê?ò3??</a> $str='<a href="test.html">測試頁面</a>'; echo htmlspecialchars($str); // <a href="test.html">測試頁面</a>
結(jié)論是,有中文的時候,最好用 htmlspecialchars ,否則可能亂碼
另外參考一下這個自定義函數(shù)
代碼如下:
function my_excerpt( $html, $len ) { // $html 應(yīng)包含一個 HTML 文檔。 // 本例將去掉 HTML 標(biāo)記,javascript 代碼 // 和空白字符。還會將一些通用的 // HTML 實體轉(zhuǎn)換成相應(yīng)的文本。 $search = array ("'<script[^>]*?>.*?</script>'si", // 去掉 javascript "'<[\/\!]*?[^<>]*?>'si", // 去掉 HTML 標(biāo)記 "'([\r\n])[\s]+'", // 去掉空白字符 "'&(quot|#34);'i", // 替換 HTML 實體 "'&(amp|#38);'i", "'&(lt|#60);'i", "'&(gt|#62);'i", "'&(nbsp|#160);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'(\d+);'e"); // 作為 PHP 代碼運行 $replace = array ("", "", "\\1", "\"", "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), "chr(\\1)"); $text = preg_replace ($search, $replace, $html); $text = trim($text); return mb_strlen($text) >= $len ? mb_substr($text, 0, $len) : ''; }
htmlspecialchar()函數(shù)和htmlentities()函數(shù)類似都是把html代碼轉(zhuǎn)換,htmlspecialchars_decode是把轉(zhuǎn)化的html的編碼轉(zhuǎn)換成轉(zhuǎn)換回來。
我們可以拿一個簡單的例子來做比較:
代碼如下:
$str='<a href="test.html">測試</a>'; $transstr = htmlspecialchars($str) ; echo $transstr . "<br />"; echo htmlspecialchars_decode($transstr)";
運行上面的代碼,就可以看出兩者的差別了。
一直都知道 PHP 中的 htmlentities 和 htmlspecialchars 函數(shù)都能把 html 中的特殊字符轉(zhuǎn)換成對應(yīng)的 character entity (不知道怎么翻譯),也一直都知道 htmlentities 和 htmlspecialchars 函數(shù)有區(qū)別,但是一直都用不到這兩個函數(shù),也就沒去研究過到底有什么區(qū)別。
今天用到了,懶得看 PHP 手冊里的鳥語,覺得這種問題應(yīng)該會有人用中文寫過,于是 Google 關(guān)鍵詞“htmlentities htmlspecialchars”,答案千篇一律。我已經(jīng)司空見慣了,復(fù)制粘貼連小學(xué)生都會。經(jīng)過對比發(fā)現(xiàn),每篇文章大概都包含兩部分:
第一部分是引用 PHP 手冊的說明:
PHP 手冊中對 htmlspecialchars 寫道:
The translations performed are:
代碼如下:
‘&' (ampersand) becomes ‘&' ‘"' (double quote) becomes ‘"' when ENT_NOQUOTES is not set. ”' (single quote) becomes ‘'' only when ENT_QUOTES is set. ‘<' (less than) becomes ‘<' ‘>' (greater than) becomes ‘>'
這部分無可厚非,但是第二部分的解釋卻并不怎么正確:
htmlspecialchars 只轉(zhuǎn)化上面這幾個html代碼,而 htmlentities 卻會轉(zhuǎn)化所有的html代碼,連同里面的它無法識別的中文字符也給轉(zhuǎn)化了。
我們可以拿一個簡單的例子來做比較:
代碼如下:
結(jié)論是,有中文的時候,最好用 htmlspecialchars ,否則可能亂碼。
難道 htmlentities 函數(shù)只有一個參數(shù)嗎?
當(dāng)然不是!htmlentities 還有三個可選參數(shù),分別是 $quote_style、 $charset、 $double_encode,手冊對 $charset 參數(shù)是這樣描述的:
Defines character set used in conversion. The default character set is ISO-8859-1.
從上面程序輸出的結(jié)果判斷,$str 是 GB2312 編碼的,“測試頁面”幾個字對應(yīng)的十六進制值是:
B2 E2 CA D4 D2 B3 C3 E6
然而卻被當(dāng)成 ISO-8859-1 編碼來解析:
2aê?ò3??
正好對應(yīng) HTML character entity 里的:
2aê?ò3??
當(dāng)然會被 htmlentities 轉(zhuǎn)義掉,但是只要加上正確的編碼作為參數(shù),根本就不會出現(xiàn)所謂的中文亂碼問題:
$str='<a href="test.html">測試頁面</a>'; echo htmlentities($str, ENT_COMPAT, 'gb2312'); // <a href="test.html">測試頁面</a>三人成虎,以訛傳訛。
結(jié)論:htmlentities 和 htmlspecialchars 的區(qū)別在于 htmlentities 會轉(zhuǎn)化所有的 html character entity,而htmlspecialchars 只會轉(zhuǎn)化手冊上列出的幾個 html character entity (也就是會影響 html 解析的那幾個基本字符)。一般來說,使用 htmlspecialchars 轉(zhuǎn)化掉基本字符就已經(jīng)足夠了,沒有必要使用 htmlentities。實在要使用 htmlentities 時,要注意為第三個參數(shù)傳遞正確的編碼。

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)
