很多人都以为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. Oracle 安装过程中 File not found "WFMLRSVCApp.ear" 的原因

    主要有两种原因: 1 只解压缩了第一个zip文件. 2 两个zip 文件解压缩到了两个不同的目录里.

  2. RAC建立过程回顾--建立用户和组

    一共需要建立6个组: oinstall dba asmadmin asmdba asmoper oper 要建立两个用户: oracle 和 grid 然后还要给各个用户建立各自的环境变量. 以下的操 ...

  3. 【转载】COM 组件设计与应用(十五)——连接点(vc6.0)

    原文:http://vckbase.com/index.php/wv/1256.html 一.前言 上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了. 二.原理 图一.连接点组件原理图.左侧 ...

  4. 远心镜头(Telecentric lens)原理介绍

    远心镜头(Telecentric lens)原理介绍 远心镜头(Telecentric lens),是为纠正传统镜头视差而设计,它可以在一定的物距范围内,使得到的图像放大倍率不会变化,简单的说这种镜头 ...

  5. 4 django篇

    1.django请求生命周期 wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架 (Flask.Django) 中间件,帮助我们对请求进行校验或在请求 ...

  6. HTML5和CSS基础

    1 HTML 基本语法 html标签 单标签 <img /> .<img> 双标签 <html> </html> 属性 属于标签 <img src ...

  7. Flutter - 左右侧滑菜单:drawer和endDrawer

    侧滑菜单可以从左面滑出,也可以从右面滑出.在Scaffold中有drawer和endDrawer两个参数,分别对应左边的菜单和右边的菜单. drawer: new Drawer( child: new ...

  8. Oracle安装到Maven本地仓库

    1.由于Maven的特性,并且之前的IDE环境已帮我们集成了Maven.而现在我们需要手动安装MVN本地仓库到电脑. 将mvn绿色安装包bin路径配置到系统环境变量Path中 验证命令: mvn –v ...

  9. 3.PO如何给开发团队讲好故事

    敏捷开发系列文章目录 讲出符合开发团队味口的故事. 上一章说了敏捷开发团队的构成与迭代过程,本章重点说一下迭代第一天的计划会议.熟话说“好的开始就成功了一半”,一个迭代的计划会议做得好不好确实直接注定 ...

  10. linux 利用cat写入一段文件

    linux 利用cat写入一段文件 cat >> /etc/rc.local <<EOFsysctl -w net.ipv4.icmp_echo_ignore_all=1sys ...