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调用Java对象的方法
Oct 09 PHP
网页上facebook分享功能具体实现
Jan 26 PHP
php实现下载限制速度示例分享
Feb 13 PHP
PHP中读取文件的8种方法和代码实例
Aug 05 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
PHP邮箱验证示例教程
Jun 01 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
Sep 14 PHP
PHP对象、模式与实践之高级特性分析
Dec 08 PHP
php数组指针操作详解
Feb 14 PHP
浅谈thinkphp5 instance 的简单实现
Jul 30 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 23 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
Jan 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+JS实现搜索自动提示(实例)
2013/06/09 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
解决laravel 出现ajax请求419(unknown status)的问题
2019/09/03 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
不使用XMLHttpRequest实现异步加载 Iframe和script
2012/10/29 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
python pickle 和 shelve模块的用法
2013/09/16 Python
python批量导出导入MySQL用户的方法
2013/11/15 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
瑞典度假品牌:OAS
2019/05/28 全球购物
教育学专业实习生的自我鉴定
2013/11/26 职场文书
追悼会上的答谢词
2014/01/10 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
领导接待方案
2014/03/13 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
政风行风评议心得体会
2014/10/21 职场文书
2016年清明节寄语
2015/12/04 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript
CSS中妙用 drop-shadow 实现线条光影效果
2021/11/11 HTML / CSS
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python