博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
htmlentities和htmlspecialchars 的区别
阅读量:6228 次
发布时间:2019-06-21

本文共 3486 字,大约阅读时间需要 11 分钟。

hot3.png

多人都以为htmlentities跟htmlspecialchars的功能是一样的,都是格式化html代码的,我以前也曾这么认为,但是今天我发现并不是这样的。

代码如下:

'&' (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 时,要注意为第三个参数传递正确的编码。

转载于:https://my.oschina.net/BearCatYN/blog/392148

你可能感兴趣的文章
来自我的破船大大的博客,记录他的iOS成长之路,与君同勉!
查看>>
GridView 编辑、删除 、分页
查看>>
[洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)
查看>>
C/C++动态二维数组的内存分配和释放
查看>>
HTC G7 官方ROM卡刷包(国行、台版、港版、印度、亚太版、欧版)
查看>>
jQuery笔记(五)jQuery表单验证
查看>>
编程助手JavaScript学习库-面向对象编程笔记
查看>>
聪明的数据结构和笨拙的逻辑代码
查看>>
php_memcache 缓存 下载-安装-配置-学习
查看>>
Java EE之通过表单上传文件
查看>>
Gnome创建桌面快捷方式
查看>>
机器人会偷走你的饭碗吗——药剂师 vs. 巨型药品包装机
查看>>
C++数据类型范围
查看>>
UVa11401
查看>>
86. Partition List
查看>>
mysql 主从配置
查看>>
记录已被另一个用户锁定处理方法
查看>>
Codeforces 595B - Pasha and Phone
查看>>
Jquery--ajax
查看>>
shell脚本:批量修改文件名
查看>>