国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP中htmlentities和htmlspecialchars的區別

2020-03-22 19:31:20
字體:
來源:轉載
供稿:網友
  • 很多人都以為htmlentities跟htmlspecialchars的功能是一樣的,都是格式化html代碼的,我以前也曾這么認為,但是今天我發現并不是這樣的。
    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代碼,連同里面的它無法識別的中文字符也給轉化了。

    我們可以拿一個簡單的例子來做比較:

    代碼如下:


    $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 標記"'([])[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()函數和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 時,要注意為第三個參數傳遞正確的編碼。


    PHP編程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙岩市| 闽侯县| 福鼎市| 乐清市| 咸丰县| 黄石市| 吴桥县| 丹寨县| 昌都县| 静安区| 沁水县| 五莲县| 拜泉县| 揭东县| 城步| 南投市| 上杭县| 米泉市| 平定县| 阜平县| 定远县| 正镶白旗| 蓝田县| 香港| 全南县| 天气| 丹寨县| 花莲市| 祁阳县| 威宁| 井研县| 张家川| 汕头市| 马公市| 凤城市| 内丘县| 玛曲县| 林口县| 乌拉特中旗| 五常市| 东阿县|