zoukankan      html  css  js  c++  java
  • php htmlentities和htmlspecialchars 的区别

    很多人都以为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 时,要注意为第三个参数传递正确的编码。

     
  • 相关阅读:
    类变量、成员变量、实例变量、局部变量、静态变量、全局变量的解释
    String的属性和方法
    数组的扩容
    以下实例演示了如何通过 List 类的 Arrays.toString () 方法和 List 类的 list.Addall(array1.asList(array2) 方法将两个数组合并为一个数组
    数组获取最大值和最小值
    Java字符串反转
    IO-3
    IO-2
    IO流
    泛型、MAP集合
  • 原文地址:https://www.cnblogs.com/zhaokai021/p/4573819.html
Copyright © 2011-2022 走看看