php htmlentities和htmlspecialchars 的区别

很多人都以为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 时,要注意为第三个参数传递正确的编码。

时间: 2024-12-28 20:35:02

php htmlentities和htmlspecialchars 的区别的相关文章

PHP中htmlentities和htmlspecialchars的区别

这两个函数的功能都是转换字符为HTML字符编码,特别是url和代码字符串.防止字符标记被浏览器执行.使用中文时没什么区别,但htmlentities会格式化中文字符使得中文输入是乱码 htmlentities转换所有的html标记,htmlspecialchars只格式化& ' " < 和 > 这几个特殊符号 $str = '<a href="demo.php?m=index&a=index&name=中文">测试页面</

PHP htmlentities 和 htmlspecialchars的区别

一直对这两个转换htm字符为html实体的函数混淆不清,查询了一下文档,总结如下 htmlentities: Convert all applicable characters to HTML entities (将所有可用的字符转换成html实体) htmlspecialchars : Convert special characters to HTML entities (将特殊的字符转换成html实体) 区别:(1) htmlentities转换所有的html标记,htmlspecialc

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

php 去除html标记--strip_tags与htmlspecialchars的区别详解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-26 本篇文章是对php中去除html标记以及strip_tags与htmlspecialchars的区别进行了详细的分析介绍,需要的朋友参考下 strip_tags  去掉 HTML 及 PHP 的标记. 语法: string strip_tags(string str); 传回值: 字串 函式种类: 资料处理 内容说明  本函式可去掉字

关于htmlentities 、htmlspecialchars、addslashes的使用

1.html_entity_decode():把html实体转换为字符. Eg:$str = "just atest & 'learn to use '"; echo html_entity_decode($str); echo "<br />"; echo html_entity_decode($str,ENT_QUOTES); echo "<br />"; echo html_entity_decode($st

153-PHP htmlentities函数

<?php //定义一个HTML代码字符串 $str=<<<HTM <a href=#><b><i>到一个网址的链接</i></b></a> HTM; $str=htmlentities($str); //将字符串中指定的字符进行转换 echo $str; ?> PHP中htmlentities和htmlspecialchars的区别:这两个函数的功能都是转换字符为HTML字符编码,特别是url和代码字符

防XXS和SQL注入

对网站发动XSS攻击的方式有很多种,仅仅使用php的一些内置过滤函数是对付不了的,即使你将filter_var,mysql_real_escape_string,htmlentities,htmlspecialchars,strip_tags这些函数都使用上了也不一定能保证绝对的安全. 那么如何预防 XSS 注入?主要还是需要在用户数据过滤方面得考虑周全,在这里不完全总结下几个 Tips 1. 假定所有的用户输入数据都是"邪恶"的 2. 弱类型的脚本语言必须保证类型和期望的一致 3.

PHP安全性防范方式

SQL注入 SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行. 防范方式 使用mysql_real_escape_string(),或者addslashes()过滤数据 手动检查每一数据是否为正确的数据类型 使用预处理语句并绑定变量 使用准备好的预处理语句 分离数据和SQL逻辑 预处理语句将自动过滤(如:转义) 把它作为一个编码规范,可以帮助团队里的新人避免遇到以上问题 相比于直接执行SQL语句,预处理语句有两个主要优点 预处理语句大大减少了分析时间,只做了

PHP如何防止XSS攻击

PHP防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数 . 在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string) 的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号(“), 不对单引号(‘)做转义. 所以,htmlspecialchars函数更多的时候要加上第二个参数, 应该这样用: htmlspecialchars($string,ENT_

php中htmlspecialchars()函数和addslashes()函数的使用和区别

在防止被注入攻击时,常会用到两个函数:htmlspecialchars()和addslashes()函数.这两个函数都是对特殊字符进行转义. 1)addslashes()作用及使用 addslashes()通常用于防止sql注入,它可对通过get,post和cookie传递过来的参数的单引号和双引号已经null前加“\”进行转义 如:如变量$str=$_POST["str"];的值为:bb' or 1='1.通过addslashes()函数过滤后会变为:bb\' or 1=\'1: 2