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和ACCESS写聊天室(四)
Oct 09 PHP
php 获取全局变量的代码
Apr 21 PHP
基于php使用memcache存储session的详解
Jun 25 PHP
PHP函数getenv简介和使用实例
May 12 PHP
php查找字符串出现次数的方法
Dec 01 PHP
php实现专业获取网站SEO信息类实例
Apr 02 PHP
php单一接口的实现方法
Jun 20 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
Mar 31 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
微信公众号开发之语音消息识别php代码
Aug 08 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 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实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
php创建session的方法实例详解
2015/01/27 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
Javascript中暂停功能的实现代码
2007/03/04 Javascript
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
JavaScript中this详解
2015/09/01 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
Javascript缓存API
2016/06/14 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
原生JS实现N级菜单的代码
2017/05/21 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
python中实现定制类的特殊方法总结
2014/09/28 Python
Python3实现Web网页图片下载
2016/01/28 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
文化与传播毕业生求职信
2014/03/09 职场文书
学校三节实施方案
2014/06/09 职场文书
多媒体教室标语
2014/06/26 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
iPhone13再次曝光
2021/04/15 数码科技
Python入门之基础语法详解
2021/05/11 Python
详解MySQL中的主键与事务
2021/05/27 MySQL
Python操作CSV格式文件的方法大全
2021/07/15 Python
使用kubeadm命令行工具创建kubernetes集群
2022/03/31 Servers