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实现框架(二)
Oct 09 PHP
PHP实现域名whois查询的代码(数据源万网、新网)
Feb 22 PHP
PHP随机数生成代码与使用实例分析
Apr 08 PHP
自定义php类(查找/修改)xml文档
Mar 26 PHP
Youku 视频绝对地址获取的方法详解
Jun 26 PHP
php生成zip文件类实例
Apr 07 PHP
PHP文件读取功能的应用实例
May 08 PHP
thinkPHP中验证码的简单使用方法
Dec 26 PHP
浅谈php和js中json的编码和解码
Oct 24 PHP
PHP实现一个简单url路由功能实例
Nov 05 PHP
php简单随机字符串生成方法示例
Apr 19 PHP
laravel实现前后台路由分离的方法
Oct 13 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
PHP中cookies使用指南
2007/03/16 PHP
PHP静态新闻列表自动生成代码
2007/06/14 PHP
JpGraph php柱状图使用介绍
2011/08/23 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
78行Python代码实现现微信撤回消息功能
2018/07/26 Python
澳大利亚相机之家:Camera House
2017/11/30 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
2014年教师培训的自我评价
2014/01/03 职场文书
学习委员自我鉴定
2014/01/13 职场文书
社会公德演讲稿
2014/05/20 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
银行求职信
2014/05/31 职场文书
政协调研汇报材料
2014/08/15 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
教师批评与自我批评
2014/10/15 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书