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

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 htmlentities和htmlspecialchars 的区别的更多相关文章

  1. PHP htmlentities 和 htmlspecialchars的区别

    一直对这两个转换htm字符为html实体的函数混淆不清,查询了一下文档,总结如下 htmlentities: Convert all applicable characters to HTML ent ...

  2. strip_tags、htmlentities、htmlspecialchars的区别

    一.strip_tags() 函数剥去字符串中的 HTML.XML 以及 PHP 的标签. strip_tags(string,allow) 注释:可通过allow设置允许的标签.这些标签不会被删除. ...

  3. php过滤字段htmlentities,htmlspecialchars,strip_tags

    1.strip_tags:过滤html标签比如<a> <html> <script> 如: $str = '<a href="test.html&q ...

  4. 过滤输入htmlentities与htmlspecialchars用法

    过滤输入 (即来自所列数据源中的任何数据)是指,转义或删除不安全的字符.在数据到达应用的存储层之前,一定要过滤输入数据.这是第一道防线.假如网站的评论表单接收html,默认情况下 访客可以毫无阻拦地在 ...

  5. php 去除html标记--strip_tags与htmlspecialchars的区别详解

    php 去除html标记--strip_tags与htmlspecialchars的区别详解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-26   本篇文章是对php中去除html ...

  6. 关于htmlentities 、htmlspecialchars、addslashes的使用

    1.html_entity_decode():把html实体转换为字符. Eg:$str = "just atest & 'learn to use '"; echo ht ...

  7. 浅谈htmlentities 、htmlspecialchars、addslashes的使用方法

    html_entity_decode():把html实体转换为字符. $str = "just atest & 'learn to use '"; echo html_en ...

  8. php 去除html标记-strip_tags和htmlspecialchars的区别

    strip_tags 去掉 HTML 及 PHP 的标记. 语法: string strip_tags(string str); 传回值: 字串 函式种类: 资料处理 内容说明 本函式可去掉字串中包含 ...

  9. 153-PHP htmlentities函数

    <?php //定义一个HTML代码字符串 $str=<<<HTM <a href=#><b><i>到一个网址的链接</i>&l ...

随机推荐

  1. P4047 [JSOI2010]部落划分

    显然二分答案\(mid\),然后距离\(\leq mid\)的点对只能放在一个部落里.然后可以并查集\(O(n^2)\)算出有多少个部落. // luogu-judger-enable-o2 #inc ...

  2. requestAnimationFrame优势何在?

    大概半年前,无意中在网上看到一个新的js函数requestAnimationFrame,据说,此函数可以优化传统的js动画效果,似乎是未来js动画的新方向. 当时我所在的项目正好用到了和js动画有关的 ...

  3. django套用模板404报错小结

    首先,我的项目名是MyProject.每次当我运行,然后测试页面的时候,总是弹出 其实根据stackoverflow上某大佬的解释大意就是在setting.py和urls.py的匹配上出了问题 此处放 ...

  4. 【Jmeter测试】接口请求完成后,查询数据库结果,检测数据存储是否正确

    Jmeter脚本逻辑 发送POST请求,把数据保存到数据库中 发讯数据库,数据库查询结果保存的变量中 使用BeanShell判断数据库查询结果 Jmeter脚本结构 第一个箭头指的是JDBC Conn ...

  5. react-native初体验(1) — hello world

    没有简介,直接开始干活吧. 默认阅读本文的你已经安装好 nodejs, windows用户需要升级yarn到最新版本. 并且设置安装源为国内的淘宝源: npm config set registry ...

  6. HTML中的map和area标签

    1. 标签介绍: (1)map标签: 该标签是指图片的映射,也就是说一张可以点击的图片的映射: 属性介绍: <1> id: <img>中的 usemap 属性可引用 <m ...

  7. [Unity Shader] 逐顶点光照和逐片元漫反射光照

    书中的6.4节讲的是漫反射的逐顶点光照和逐片元光照. 前一种算法是根据漫反射公式计算顶点颜色(顶点着色器),对颜色插值(光栅化过程)返回每个像素的颜色值(片元着色器). 第二种算法是获得顶点的法线(顶 ...

  8. Shader开发之烘焙Lightmap自发光

    自己参考Build-in写了一套shader, 写完发现自发光部分在烘焙时不生效, 查阅资料发现需要在Material上设置为对应标记, 这部分功能可以像Standard Shader一样写在Shad ...

  9. 图形 - bootStrap4常用CSS笔记

    .rounded 图片显示圆角效果 .rounded-circle 设置椭圆形图片 .img-thumbnail 设置图片缩略图(图片有边框) .img-fluid 响应式图片 .float-righ ...

  10. swap分区和内存

    1  查看swap 空间大小(总计):      # free -m          默认单位为k, -m 单位为M                total       used       fr ...