温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

htmlentities和htmlspecialchars 的区别有哪些

发布时间:2021-10-12 17:03:19 来源:亿速云 阅读:153 作者:柒染 栏目:开发技术

这篇文章将为大家详细讲解有关htmlentities和htmlspecialchars 的区别有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

  多人都以为htmlentities跟htmlspecialchars的功能是一样的,都是格式化html代码的,我以前也曾这么认为,但是今天我发现并不是这样的。

  htmlentities和htmlspecialchars 的区别

  代码如下:

  '&' (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='测试页面';

  echo htmlentities($str);

  // ²âÊÔÒ³Ãæ

  $str='测试页面';

  echo htmlspecialchars($str);

  // 测试页面

  结论是,有中文的时候,最好用 htmlspecialchars ,否则可能乱码

  另外参考一下这个自定义函数

  代码如下:

  function my_excerpt( $html, $len ) {

  // $html 应包含一个 HTML 文档。

  // 本例将去掉 HTML 标记,javascript 代码

  // 和空白字符。还会将一些通用的

  // HTML 实体转换成相应的文本。

  $search = array ("']*?>.*?'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) : '';

  }

  htmlspecialchar()函数和htmlentities()函数类似都是把html代码转换,htmlspecialchars_decode是把转化的html的编码转换成转换回来。

  我们可以拿一个简单的例子来做比较:

  代码如下:

  $str='测试';

  $transstr = htmlspecialchars($str) ;

  echo $transstr . "

  ";

  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代码,连同里面的它无法识别的中文字符也给转化了。

  我们可以拿一个简单的例子来做比较:

  代码如下:

  $str='测试页面';

  echo htmlentities($str);

  // ²âÊÔÒ³Ãæ

  $str='测试页面';

  echo htmlspecialchars($str);

  // 测试页面

  ?>

  结论是,有中文的时候,最好用 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='测试页面';

  echo htmlentities($str, ENT_COMPAT, 'gb2312');

  // 测试页面三人成虎,以讹传讹。

  结论:htmlentities 和 htmlspecialchars 的区别在于 htmlentities 会转化所有的 html character entity,而htmlspecialchars 只会转化手册上列出的几个 html character entity (也就是会影响 html 解析的那几个基本字符)。一般来说,使用 htmlspecialchars 转化掉基本字符就已经足够了,没有必要使用 htmlentities。实在要使用 htmlentities 时,要注意为第三个参数传递正确的编码。

关于htmlentities和htmlspecialchars 的区别有哪些就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI