php htmlentities和htmlspecialchars 的区别


Posted in PHP onAugust 18, 2008

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

PHP 相关文章推荐
第四节--构造函数和析构函数
Nov 16 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
May 24 PHP
php广告加载类用法实例
Sep 23 PHP
php实现以只读方式打开文件的方法
Mar 16 PHP
php实现统计网站在线人数的方法
May 12 PHP
PHP函数import_request_variables()用法分析
Apr 02 PHP
php分页原理 分页代码 分页类制作教程
Sep 23 PHP
PHP使用递归算法无限遍历数组示例
Jan 13 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 PHP
php适配器模式简单应用示例
Oct 23 PHP
php 文件上传至OSS及删除远程阿里云OSS文件
Jul 04 PHP
php magic_quotes_gpc的一点认识与分析
Aug 18 #PHP
php数组应用之比较两个时间的相减排序
Aug 18 #PHP
php中的数组操作函数整理
Aug 18 #PHP
PHP去除数组中重复的元素并按键名排序函数
Aug 18 #PHP
删除数组元素实用的PHP数组函数
Aug 18 #PHP
PHP 数组实例说明
Aug 18 #PHP
PHP获取网站域名和地址的代码
Aug 17 #PHP
You might like
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
2017/02/04 PHP
php精度计算的问题解析
2019/06/21 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
2019/11/13 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
几个javascript操作word的参考代码
2009/10/26 Javascript
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
js中less常用的方法小结
2017/08/09 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
Python是编译运行的验证方法
2015/01/30 Python
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
python使用arcpy.mapping模块批量出图
2017/03/06 Python
python 字典中取值的两种方法小结
2018/08/02 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
C语言基础笔试题
2013/04/27 面试题
2014年大学生自我评价
2014/01/19 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
家长会欢迎标语
2014/06/24 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
护士2014年终工作总结
2014/11/11 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
乔迁新居祝福语
2019/11/04 职场文书
详解Python生成器和基于生成器的协程
2021/06/03 Python
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers