打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
php htmlentities和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代码,连同里面的它无法识别的中文字符也给转化了。

我们可以拿一个简单的例子来做比较:

$str='<a href='test.html'>测试页面</a>';
echo htmlentities($str);
// <a href='test.html'>2aê?ò3??</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'>2aê?ò3??</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 编码来解析:

2aê?ò3??

正好对应 HTML character entity 里的:

2aê?ò3??

当然会被 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 时,要注意为第三个参数传递正确的编码。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
编程语言php中htmlspecialchars、strip_tags、addslashes函数的简单介绍
跨站脚本漏洞(XSS)基础讲解
关于在php中html标签的转换问题的解决
php字符串处理函数大全
PHP动态网页开发中常用的一些函数
PHP trim() 函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服