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 相关文章推荐
使用PHP的日期与时间函数技巧
Apr 24 PHP
在PHP中养成7个面向对象的好习惯
Jan 28 PHP
重新封装zend_soap实现http连接安全认证的php代码
Jan 12 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
php获取文件夹路径内的图片以及分页显示示例
Mar 11 PHP
PHP按行读取文件时删除换行符的3种方法
May 04 PHP
Laravel中使用自己编写类库的3种方法
Feb 10 PHP
php的闭包(Closure)匿名函数详解
Feb 22 PHP
PHP进行批量任务处理不超时的解决方法
Jul 11 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
php apache开启跨域模式过程详解
Jul 08 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
js的匿名函数使用介绍
2013/12/11 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
深入解析Python中函数的参数与作用域
2016/03/20 Python
手把手教你python实现SVM算法
2017/12/27 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
数控技术与应用毕业生自荐信
2013/09/24 职场文书
证券期货行业个人的自我评价
2013/12/26 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
考博导师推荐信范文
2015/03/27 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
超市啤酒狂欢夜策划方案范文!
2019/07/03 职场文书
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android