htmlentities和htmlspecialchars 的區別

多人都覺得htmlentities跟htmlspecialchars的功能是同樣的,都是格式化html代碼的,我之前也曾這麼認爲,可是今天我發現並非這樣的。javascript

代碼以下:php

'&' (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 '>' html

htmlspecialchars 只轉化上面這幾個html代碼,而 htmlentities 卻會轉化全部的html代碼,連同裏面的它沒法識別的中文字符也給轉化了。 

咱們能夠拿一個簡單的例子來作比較: java

代碼以下:less

$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> 
函數


結論是,有中文的時候,最好用 htmlspecialchars ,不然可能亂碼 

另外參考一下這個自定義函數 測試


代碼以下:編碼

function my_excerpt( $html, $len ) { 
// $html 應包含一個 HTML 文檔。 
// 本例將去掉 HTML 標記,javascript 代碼 
// 和空白字符。還會將一些通用的 
// HTML 實體轉換成相應的文本。 
$search = array ("'<script[^>]*?>.*?</script>'si", // 去掉 javascript 
"'<[\/\!]*?[^<>]*?>'si", // 去掉 HTML 標記 
"'([\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) : ''; 

spa


htmlspecialchar()函數和htmlentities()函數相似都是把html代碼轉換,htmlspecialchars_decode是把轉化的html的編碼轉換成轉換回來。 

咱們能夠拿一個簡單的例子來作比較: 翻譯


代碼以下:

$str='<a href="test.html">測試</a>'; 
$transstr = htmlspecialchars($str) ; 
echo $transstr . "<br />"; 
echo htmlspecialchars_decode($transstr)"; 


運行上面的代碼,就能夠看出二者的差異了。

一直都知道 PHP 中的 htmlentities 和 htmlspecialchars 函數都能把 html 中的特殊字符轉換成對應的 character entity (不知道怎麼翻譯),也一直都知道 htmlentities 和 htmlspecialchars 函數有區別,可是一直都用不到這兩個函數,也就沒去研究過到底有什麼區別。 


今天用到了,懶得看 PHP 手冊裏的鳥語,以爲這種問題應該會有人用中文寫過,因而 Google 關鍵詞「htmlentities htmlspecialchars」,答案千篇一概。我已經司空見慣了,複製粘貼連小學生都會。通過對比發現,每篇文章大概都包含兩部分: 

第一部分是引用 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 只轉化上面這幾個html代碼,而 htmlentities 卻會轉化全部的html代碼,連同裏面的它沒法識別的中文字符也給轉化了。 

咱們能夠拿一個簡單的例子來作比較: 


代碼以下:

<?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> 

?> 

結論是,有中文的時候,最好用 htmlspecialchars ,不然可能亂碼。 難道 htmlentities 函數只有一個參數嗎?固然不是!htmlentities 還有三個可選參數,分別是 $quote_style、 $charset、 $double_encode,手冊對 $charset 參數是這樣描述的: Defines character set used in conversion. The default character set is ISO-8859-1. 從上面程序輸出的結果判斷,$str 是 GB2312 編碼的,「測試頁面」幾個字對應的十六進制值是: B2 E2 CA D4 D2 B3 C3 E6 然而卻被當成 ISO-8859-1 編碼來解析: ²âÊÔÒ³Ãæ 正好對應 HTML character entity 裏的: ²âÊÔÒ³Ãæ 固然會被 htmlentities 轉義掉,可是隻要加上正確的編碼做爲參數,根本就不會出現所謂的中文亂碼問題: $str='<a href="test.html">測試頁面</a>'; echo htmlentities($str, ENT_COMPAT, 'gb2312'); // <a href="test.html">測試頁面</a>三人成虎,以訛傳訛。 結論:htmlentities 和 htmlspecialchars 的區別在於 htmlentities 會轉化全部的 html character entity,而htmlspecialchars 只會轉化手冊上列出的幾個 html character entity (也就是會影響 html 解析的那幾個基本字符)。通常來講,使用 htmlspecialchars 轉化掉基本字符就已經足夠了,沒有必要使用 htmlentities。實在要使用 htmlentities 時,要注意爲第三個參數傳遞正確的編碼。

相關文章
相關標籤/搜索