最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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 '&lt;'
'>' (greater than) becomes '&gt;'

htmlspecialchars 只轉(zhuǎn)化上面這幾個(gè)html代碼,而 htmlentities 卻會(huì)轉(zhuǎn)化所有的html代碼,連同里面的它無(wú)法識(shí)別的中文字符也給轉(zhuǎn)化了。

我們可以拿一個(gè)簡(jiǎn)單的例子來(lái)做比較:
復(fù)制代碼 代碼如下:

$str='<a href="test.html">測(cè)試頁(yè)面</a>';
echo htmlentities($str);
// &lt;a href=&quot;test.html&quot;&gt;&sup2;&acirc;&Ecirc;&Ocirc;&Ograve;&sup3;&Atilde;&aelig;&lt;/a&gt;

$str='<a href="test.html">測(cè)試頁(yè)面</a>';
echo htmlspecialchars($str);
// &lt;a href=&quot;test.html&quot;&gt;測(cè)試頁(yè)面&lt;/a&gt;

結(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ù)類(lèi)似都是把html代碼轉(zhuǎn)換,htmlspecialchars_decode是把轉(zhuǎn)化的html的編碼轉(zhuǎn)換成轉(zhuǎn)換回來(lái)。

我們可以拿一個(gè)簡(jiǎn)單的例子來(lái)做比較:
復(fù)制代碼 代碼如下:

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

運(yùn)行上面的代碼,就可以看出兩者的差別了。

一直都知道 PHP 中的 htmlentities 和 htmlspecialchars 函數(shù)都能把 html 中的特殊字符轉(zhuǎn)換成對(duì)應(yīng)的 character entity (不知道怎么翻譯),也一直都知道 htmlentities 和 htmlspecialchars 函數(shù)有區(qū)別,但是一直都用不到這兩個(gè)函數(shù),也就沒(méi)去研究過(guò)到底有什么區(qū)別。


今天用到了,懶得看 PHP 手冊(cè)里的鳥(niǎo)語(yǔ),覺(jué)得這種問(wèn)題應(yīng)該會(huì)有人用中文寫(xiě)過(guò),于是 Google 關(guān)鍵詞“htmlentities htmlspecialchars”,答案千篇一律。我已經(jīng)司空見(jiàn)慣了,復(fù)制粘貼連小學(xué)生都會(huì)。經(jīng)過(guò)對(duì)比發(fā)現(xiàn),每篇文章大概都包含兩部分:

第一部分是引用 PHP 手冊(cè)的說(shuō)明:

PHP 手冊(cè)中對(duì) htmlspecialchars 寫(xiě)道:

The translations performed are:
復(fù)制代碼 代碼如下:

‘&' (ampersand) becomes ‘&amp;'
‘"' (double quote) becomes ‘&quot;' when ENT_NOQUOTES is not set.
”' (single quote) becomes ‘&#039;' only when ENT_QUOTES is set.
‘<' (less than) becomes ‘&lt;'
‘>' (greater than) becomes ‘&gt;'

這部分無(wú)可厚非,但是第二部分的解釋卻并不怎么正確:

htmlspecialchars 只轉(zhuǎn)化上面這幾個(gè)html代碼,而 htmlentities 卻會(huì)轉(zhuǎn)化所有的html代碼,連同里面的它無(wú)法識(shí)別的中文字符也給轉(zhuǎn)化了。

我們可以拿一個(gè)簡(jiǎn)單的例子來(lái)做比較:
復(fù)制代碼 代碼如下:

<?php
$str='<a href="test.html">測(cè)試頁(yè)面</a>';
echo htmlentities($str);

// &lt;a href=&quot;test.html&quot;&gt;&sup2;&acirc;&Ecirc;&Ocirc;&Ograve;&sup3;&Atilde;&aelig;&lt;/a&gt;

$str='<a href="test.html">測(cè)試頁(yè)面</a>';
echo htmlspecialchars($str);
// &lt;a href=&quot;test.html&quot;&gt;測(cè)試頁(yè)面&lt;/a&gt;

?>

結(jié)論是,有中文的時(shí)候,最好用 htmlspecialchars ,否則可能亂碼。

難道 htmlentities 函數(shù)只有一個(gè)參數(shù)嗎?當(dāng)然不是!htmlentities 還有三個(gè)可選參數(shù),分別是 $quote_style、 $charset、 $double_encode,手冊(cè)對(duì) $charset 參數(shù)是這樣描述的:

Defines character set used in conversion. The default character set is ISO-8859-1.

從上面程序輸出的結(jié)果判斷,$str 是 GB2312 編碼的,“測(cè)試頁(yè)面”幾個(gè)字對(duì)應(yīng)的十六進(jìn)制值是:

B2 E2 CA D4 D2 B3 C3 E6

然而卻被當(dāng)成 ISO-8859-1 編碼來(lái)解析:

²âÊÔÒ³Ãæ

正好對(duì)應(yīng) HTML character entity 里的:

&sup2;&acirc;&Ecirc;&Ocirc;&Ograve;&sup3;&Atilde;&aelig;

當(dāng)然會(huì)被 htmlentities 轉(zhuǎn)義掉,但是只要加上正確的編碼作為參數(shù),根本就不會(huì)出現(xiàn)所謂的中文亂碼問(wèn)題:

$str='<a href="test.html">測(cè)試頁(yè)面</a>';

echo htmlentities($str, ENT_COMPAT, 'gb2312');
// &lt;a href=&quot;test.html&quot;&gt;測(cè)試頁(yè)面&lt;/a&gt;三人成虎,以訛傳訛。

結(jié)論:htmlentities 和 htmlspecialchars 的區(qū)別在于 htmlentities 會(huì)轉(zhuǎn)化所有的 html character entity,而htmlspecialchars 只會(huì)轉(zhuǎn)化手冊(cè)上列出的幾個(gè) html character entity (也就是會(huì)影響 html 解析的那幾個(gè)基本字符)。一般來(lái)說(shuō),使用 htmlspecialchars 轉(zhuǎn)化掉基本字符就已經(jīng)足夠了,沒(méi)有必要使用 htmlentities。實(shí)在要使用 htmlentities 時(shí),要注意為第三個(gè)參數(shù)傳遞正確的編碼。

相關(guān)文章

  • PHP abstract 抽象類(lèi)定義與用法示例

    PHP abstract 抽象類(lèi)定義與用法示例

    這篇文章主要介紹了PHP abstract 抽象類(lèi)定義與用法,結(jié)合實(shí)例形式分析了php定義abstract抽象類(lèi)以及繼承抽象類(lèi)等具體使用技巧,需要的朋友可以參考下
    2018-05-05
  • PHP 面向?qū)ο髮?shí)現(xiàn)代碼

    PHP 面向?qū)ο髮?shí)現(xiàn)代碼

    如果要?jiǎng)?chuàng)建一個(gè)模型,這個(gè)模型將由一些緊密相關(guān)的對(duì)象采用,就可以使用抽象類(lèi)。
    2009-11-11
  • php獲取系統(tǒng)變量方法小結(jié)

    php獲取系統(tǒng)變量方法小結(jié)

    這篇文章主要介紹了php獲取系統(tǒng)變量方法,實(shí)例總結(jié)了get_defined_vars、get_object_vars、phpinfo及phpversion等方法獲取系統(tǒng)信息的相關(guān)使用技巧,需要的朋友可以參考下
    2015-05-05
  • php簡(jiǎn)單統(tǒng)計(jì)中文個(gè)數(shù)的方法

    php簡(jiǎn)單統(tǒng)計(jì)中文個(gè)數(shù)的方法

    這篇文章主要介紹了php簡(jiǎn)單統(tǒng)計(jì)中文個(gè)數(shù)的方法,涉及strlen、mb_strlen及mb_strwidth等函數(shù)的使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-09-09
  • php實(shí)現(xiàn)xml數(shù)據(jù)轉(zhuǎn)數(shù)組兩種方式

    php實(shí)現(xiàn)xml數(shù)據(jù)轉(zhuǎn)數(shù)組兩種方式

    這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)xml數(shù)據(jù)轉(zhuǎn)數(shù)組兩種方式的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以參考下
    2023-11-11
  • 使用PHP接收POST數(shù)據(jù),解析json數(shù)據(jù)

    使用PHP接收POST數(shù)據(jù),解析json數(shù)據(jù)

    本篇文章是對(duì)使用PHP接收POST數(shù)據(jù)以及json數(shù)據(jù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • php設(shè)計(jì)模式之委托模式

    php設(shè)計(jì)模式之委托模式

    這篇文章主要為大家詳細(xì)介紹了php設(shè)計(jì)模式之委托模式,以一個(gè)實(shí)例為大家介紹了php委托模式,感興趣的朋友可以參考一下
    2016-02-02
  • php header()函數(shù)使用說(shuō)明

    php header()函數(shù)使用說(shuō)明

    PHP只是以HTTP協(xié)議將HTML文檔的標(biāo)頭送到瀏覽器,告訴瀏覽器具體怎么處理這個(gè)頁(yè)面,至于傳送的內(nèi)容則需要熟悉一下HTTP協(xié)議了,與PHP無(wú)關(guān)了,可參照
    2008-07-07
  • PHP goto語(yǔ)句用法實(shí)例

    PHP goto語(yǔ)句用法實(shí)例

    在本篇文章里小編給大家整理了關(guān)于PHP goto語(yǔ)句用法的相關(guān)實(shí)例以及語(yǔ)法講解,需要的朋友們參考學(xué)習(xí)下。
    2019-08-08
  • php實(shí)現(xiàn)遍歷多維數(shù)組的方法

    php實(shí)現(xiàn)遍歷多維數(shù)組的方法

    這篇文章主要介紹了php實(shí)現(xiàn)遍歷多維數(shù)組的方法,涉及php針對(duì)多維數(shù)組的遍歷與遞歸操作實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11

最新評(píng)論

沽源县| 乌兰县| 略阳县| 阳朔县| 哈巴河县| 蕉岭县| 乐陵市| 安乡县| 通化市| 盘锦市| 西藏| 杭锦旗| 临夏市| 翁牛特旗| 高雄市| 大荔县| 凌源市| 光山县| 正定县| 吴江市| 西丰县| 沙洋县| 宝鸡市| 鄢陵县| 镇安县| 东宁县| 勐海县| 潢川县| 仙桃市| 泰兴市| 馆陶县| 临沂市| 东丰县| 蚌埠市| 托克托县| 嘉义市| 香格里拉县| 仪征市| 泸溪县| 林口县| 岗巴县|