欢迎使用CSDN-markdown编辑器

来源:互联网 发布:php curl 查看请求头 编辑:程序博客网 时间:2024/05/22 12:19
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )

从上面PHP中htmlentities和htmlspecialcharx的接口定义可以知道:

两者都是将html特殊符号(如< > & ’ “)等转化为一个替代的html entity(如:< 对应<),但是两者之间还是有一些区别。

用法如下:

$str = "A 'quote' is <b>bold</b>";echo htmlentities($str);// Outputs: A 'quote' is <b>bold</b>echo htmlentities($str, ENT_QUOTES);// Outputs: A 'quote' is <b>bold</b>

参数说明:
flag 标志是否处理单引号、双引号:

ENT_COMPAT Will convert double-quotes and leave single-quotes alone.
ENT_QUOTES Will convert both double and single quotes.
ENT_NOQUOTES Will leave both double and single quotes unconverted.

encoding:字符集编码
差别:

要理解两者的差别,先看两个文档说明:
1. 简介:

html_entity_decode — Convert all HTML entities to their applicable charactershtmlentities — Convert all applicable characters to HTML entitieshtmlspecialchars_decode — Convert special HTML entities back to charactershtmlspecialchars - Convert special characters to HTML entities
  1. 文档:

    htmlentities:

    This function is identical to htmlspecialchars() in all ways, * except with htmlentities(), all characters which have HTML character entity equivalents are translated into these entities.*

    htmlspecialchars :

    If you require all input substrings that have associated named entities to be translated, use htmlentities() instead.

重点:

htmlspecialchars 只转换(& < > ’ ” )这几个字符

而htmlentities 转换所有含有对应“html实体”的特殊字符,比如货币表示符号欧元英镑等、版权符号等。 其他符号列表可以参考:http://www.thesauruslex.com/typo/eng/enghtml.htm

Eg:

//**注意这里的欧元字符的区别:**echo htmlentities('€ <>"')."\r\n";//€ <>"echo htmlspecialchars('€ <>"')."\r\n";//€ <>"

网络理解的错误

有一些人对这两个字符的差别存在很大的理解错误。比如这里:http://www.cnblogs.com/A-Song/archive/2011/12/20/2294599.html
说:
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 还有三个可选参数,分别是 quotestyle、charset、 doubleencode,手册对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 时,要注意为第三个参数传递正确的编码。
**

原创粉丝点击