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多线程下载远程多个文件
Jun 25 PHP
服务器变量 $_SERVER 的深入解析
Jul 02 PHP
PHP中使用正则表达式提取中文实现笔记
Jan 20 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
PHP连接操作access数据库实例
Mar 30 PHP
Yii2隐藏frontend/web和backend/web的方法
Dec 12 PHP
WordPress中用于获取文章作者与分类信息的方法整理
Dec 17 PHP
CodeIgniter配置之config.php用法实例分析
Jan 19 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
Feb 15 PHP
PHP中spl_autoload_register()函数用法实例详解
Jul 18 PHP
php输出图像的方法实例分析
Feb 16 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
Jun 22 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
4.与数据库的连接
2006/10/09 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
js 动态文字滚动的例子
2011/01/17 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
解决自定义$(id)的方法与jquery选择器$冲突的问题
2014/06/14 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
JavaScript通过select动态更换图片的方法
2015/03/23 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
Vue2.0权限树组件实现代码
2017/08/29 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
javascript实现文件拖拽事件
2018/03/29 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
Python中zip()函数用法实例教程
2014/07/31 Python
Python实现的下载8000首儿歌的代码分享
2014/11/21 Python
基于Python实现对PDF文件的OCR识别
2016/08/05 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
python如何保存文本文件
2020/06/07 Python
用pandas划分数据集实现训练集和测试集
2020/07/20 Python
python学习笔记之多进程
2020/08/06 Python
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
运动会闭幕式主持词
2015/07/01 职场文书
如何制定一份可行的计划!
2019/06/21 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
Python Pandas常用函数方法总结
2021/06/15 Python
Python实现双向链表
2022/05/25 Python