php htmlentities和htmlspecialchars 的区别
程序员文章站
2022-04-09 10:40:53
the translations performed are: 复制代码 代码如下: '&' (ampersand) becomes '&' '"' (double...
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 标记
"'([\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='<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 时,要注意为第三个参数传递正确的编码。
上一篇: vs中通过剪切板循环来循环粘贴不同内容
推荐阅读
-
Eclipse的PHP插件PHPEclipse安装和使用
-
Vue中的作用域CSS和CSS模块的区别
-
电商互联网营销系列:产品软文和网店产品页详情描述的区别
-
字符串长度函数strlen和mb_strlen的区别示例介绍
-
PHP实现数组转JSon和JSon转数组的方法示例
-
Python中extend和append的区别讲解
-
PHP中nowdoc和heredoc使用需要注意的一点
-
python中xrange和range的区别
-
php的declare控制符和ticks教程(附示例)
-
Python Pandas DataFrame:查询数据or选择数据(selection)之loc,iloc,at,iat,ix的用法和区别