htmlentities和htmlspecialchars 的区别有哪些
创始人
2024-12-17 08:22:24
0次

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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...