php htmlentities和htmlspecialchars 的區(qū)別
更新時(shí)間:2008年08月18日 20:33:46 作者:
很多人都以為htmlentities跟htmlspecialchars的功能是一樣的,都是格式化html代碼的,我以前也曾這么認(rèn)為,但是今天我發(fā)現(xiàn)并不是這樣的。
The translations performed are:
復(fù)制代碼 代碼如下:
'&' (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)化上面這幾個(gè)html代碼,而 htmlentities 卻會(huì)轉(zhuǎn)化所有的html代碼,連同里面的它無法識(shí)別的中文字符也給轉(zhuǎn)化了。
我們可以拿一個(gè)簡單的例子來做比較:
復(fù)制代碼 代碼如下:
$str='<a href="test.html">測試頁面</a>';
echo htmlentities($str);
// <a href="test.html">²âÊÔÒ³Ãæ</a>
$str='<a href="test.html">測試頁面</a>';
echo htmlspecialchars($str);
// <a href="test.html">測試頁面</a>
結(jié)論是,有中文的時(shí)候,最好用 htmlspecialchars ,否則可能亂碼
另外參考一下這個(gè)自定義函數(shù)
復(fù)制代碼 代碼如下:
function my_excerpt( $html, $len ) {
// $html 應(yīng)包含一個(gè) HTML 文檔。
// 本例將去掉 HTML 標(biāo)記,javascript 代碼
// 和空白字符。還會(huì)將一些通用的
// HTML 實(shí)體轉(zhuǎn)換成相應(yīng)的文本。
$search = array ("'<script[^>]*?>.*?</script>'si", // 去掉 javascript
"'<[\/\!]*?[^<>]*?>'si", // 去掉 HTML 標(biāo)記
"'([\r\n])[\s]+'", // 去掉空白字符
"'&(quot|#34);'i", // 替換 HTML 實(shí)體
"'&(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 代碼運(yùn)行
$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)換回來。
我們可以拿一個(gè)簡單的例子來做比較:
復(fù)制代碼 代碼如下:
$str='<a href="test.html">測試</a>';
$transstr = htmlspecialchars($str) ;
echo $transstr . "<br />";
echo htmlspecialchars_decode($transstr)";
運(yùn)行上面的代碼,就可以看出兩者的差別了。
一直都知道 PHP 中的 htmlentities 和 htmlspecialchars 函數(shù)都能把 html 中的特殊字符轉(zhuǎn)換成對應(yīng)的 character entity (不知道怎么翻譯),也一直都知道 htmlentities 和 htmlspecialchars 函數(shù)有區(qū)別,但是一直都用不到這兩個(gè)函數(shù),也就沒去研究過到底有什么區(qū)別。
今天用到了,懶得看 PHP 手冊里的鳥語,覺得這種問題應(yīng)該會(huì)有人用中文寫過,于是 Google 關(guān)鍵詞“htmlentities htmlspecialchars”,答案千篇一律。我已經(jīng)司空見慣了,復(fù)制粘貼連小學(xué)生都會(huì)。經(jīng)過對比發(fā)現(xiàn),每篇文章大概都包含兩部分:
第一部分是引用 PHP 手冊的說明:
PHP 手冊中對 htmlspecialchars 寫道:
The translations performed are:
復(fù)制代碼 代碼如下:
‘&' (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)化上面這幾個(gè)html代碼,而 htmlentities 卻會(huì)轉(zhuǎn)化所有的html代碼,連同里面的它無法識(shí)別的中文字符也給轉(zhuǎn)化了。
我們可以拿一個(gè)簡單的例子來做比較:
復(fù)制代碼 代碼如下:
<?php
$str='<a href="test.html">測試頁面</a>';
echo htmlentities($str);
// <a href="test.html">²âÊÔÒ³Ãæ</a>
$str='<a href="test.html">測試頁面</a>';
echo htmlspecialchars($str);
// <a href="test.html">測試頁面</a>
?>
結(jié)論是,有中文的時(shí)候,最好用 htmlspecialchars ,否則可能亂碼。
難道 htmlentities 函數(shù)只有一個(gè)參數(shù)嗎?當(dāng)然不是!htmlentities 還有三個(gè)可選參數(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 編碼的,“測試頁面”幾個(gè)字對應(yīng)的十六進(jìn)制值是:
B2 E2 CA D4 D2 B3 C3 E6
然而卻被當(dāng)成 ISO-8859-1 編碼來解析:
²âÊÔÒ³Ãæ
正好對應(yīng) HTML character entity 里的:
²âÊÔÒ³Ãæ
當(dāng)然會(huì)被 htmlentities 轉(zhuǎn)義掉,但是只要加上正確的編碼作為參數(shù),根本就不會(huì)出現(xiàn)所謂的中文亂碼問題:
$str='<a href="test.html">測試頁面</a>';
echo htmlentities($str, ENT_COMPAT, 'gb2312');
// <a href="test.html">測試頁面</a>三人成虎,以訛傳訛。
結(jié)論:htmlentities 和 htmlspecialchars 的區(qū)別在于 htmlentities 會(huì)轉(zhuǎn)化所有的 html character entity,而htmlspecialchars 只會(huì)轉(zhuǎn)化手冊上列出的幾個(gè) html character entity (也就是會(huì)影響 html 解析的那幾個(gè)基本字符)。一般來說,使用 htmlspecialchars 轉(zhuǎn)化掉基本字符就已經(jīng)足夠了,沒有必要使用 htmlentities。實(shí)在要使用 htmlentities 時(shí),要注意為第三個(gè)參數(shù)傳遞正確的編碼。
相關(guān)文章
Discuz不使用插件實(shí)現(xiàn)簡單的打賞功能
今天小編就為大家分享一篇關(guān)于Discuz不使用插件實(shí)現(xiàn)簡單的打賞功能,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03PHP連接MySQL數(shù)據(jù)庫操作代碼實(shí)例解析
這篇文章主要介紹了PHP連接MySQL數(shù)據(jù)庫操作代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07PHP7.1方括號(hào)數(shù)組符號(hào)多值復(fù)制及指定鍵值賦值用法分析
這篇文章主要介紹了PHP7.1方括號(hào)數(shù)組符號(hào)多值復(fù)制及指定鍵值賦值用法,結(jié)合實(shí)例形式對比分析了php7數(shù)組復(fù)制與賦值的新特性與操作技巧,需要的朋友可以參考下2016-09-09解析PHP函數(shù)array_flip()在重復(fù)數(shù)組元素刪除中的作用
本篇文章是對PHP函數(shù)array_flip()在重復(fù)數(shù)組元素刪除中的作用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06用Json實(shí)現(xiàn)PHP與JavaScript間數(shù)據(jù)交換的方法詳解
本篇文章是對用Json實(shí)現(xiàn)PHP與JavaScript間數(shù)據(jù)交換的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php實(shí)現(xiàn)curl模擬ftp上傳的方法
這篇文章主要介紹了php實(shí)現(xiàn)curl模擬ftp上傳的方法,實(shí)例分析了php基于curl實(shí)現(xiàn)FTP傳輸文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07