欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

PHP中htmlentities和 htmlspecialchars区别 有大用

简介:

<code class="hljs mel has-numbering"><span class="hljs-keyword">string</span> htmlspecialchars ( <span class="hljs-keyword">string</span> <span class="hljs-variable">$string</span> [, <span class="hljs-keyword">int</span> <span class="hljs-variable">$flags</span> = ENT_COMPAT | ENT_HTML401 [, <span class="hljs-keyword">string</span> <span class="hljs-variable">$encoding</span> = ini_get(<span class="hljs-string">"default_charset"</span>) [, bool <span class="hljs-variable">$double_encode</span> = true ]]] )

<span class="hljs-keyword">string</span> htmlentities ( <span class="hljs-keyword">string</span> <span class="hljs-variable">$string</span> [, <span class="hljs-keyword">int</span> <span class="hljs-variable">$flags</span> = ENT_COMPAT | ENT_HTML401 [, <span class="hljs-keyword">string</span> <span class="hljs-variable">$encoding</span> = ini_get(<span class="hljs-string">"default_charset"</span>) [, bool <span class="hljs-variable">$double_encode</span> = true ]]] )
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>

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

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

用法如下:

<code class="hljs bash has-numbering"><span class="hljs-variable">$str</span> = <span class="hljs-string">"A 'quote' is <b>bold</b>"</span>;

<span class="hljs-built_in">echo</span> htmlentities(<span class="hljs-variable">$str</span>);
// Outputs: A <span class="hljs-string">'quote'</span> is <b>bold</b>


<span class="hljs-built_in">echo</span> htmlentities(<span class="hljs-variable">$str</span>, ENT_QUOTES);
// Outputs: A <span class="hljs-string">'quote'</span> is <b>bold</b>


</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>

参数说明:
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 characters

  • htmlentities — Convert all applicable characters to HTML entities

  • htmlspecialchars_decode — Convert special HTML entities back to characters

  • htmlspecialchars - Convert special characters to HTML entities

2. 文档:

  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.*

  2. 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:

<code class="hljs php has-numbering"><span class="hljs-comment">//**注意这里的欧元字符的区别:**</span>
<span class="hljs-keyword">echo</span> htmlentities(<span class="hljs-string">'€ <>"'</span>).<span class="hljs-string">"\r\n"</span>;
<span class="hljs-comment">//€ <>"</span>

<span class="hljs-keyword">echo</span> htmlspecialchars(<span class="hljs-string">'€ <>"'</span>).<span class="hljs-string">"\r\n"</span>;
<span class="hljs-comment">//€ <>"</span>
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>

网络理解的错误

有一些人对这两个字符的差别存在很大的理解错误。比如这里:http://www.cnblogs.com/A-Song/archive/2011/12/20/2294599.html
说:
htmlspecialchars 只转化上面这几个html字符,而 htmlentities 却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。

用的是下面这个例子:

<code class="hljs xml has-numbering"><span class="php"><span class="hljs-preprocessor"><?php</span> 
<span class="hljs-variable">$str</span>=<span class="hljs-string">'<a href="test.html">测试页面</a>'</span>; 
<span class="hljs-keyword">echo</span> htmlentities(<span class="hljs-variable">$str</span>); 

<span class="hljs-comment">// <a href="test.html">²âÊÔÒ³Ãæ</a> </span>

<span class="hljs-variable">$str</span>=<span class="hljs-string">'<a href="test.html">测试页面</a>'</span>; 
<span class="hljs-keyword">echo</span> htmlspecialchars(<span class="hljs-variable">$str</span>); 
<span class="hljs-comment">// <a href="test.html">测试页面</a> </span>

<span class="hljs-preprocessor">?></span></span> 
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>

结论是,有中文的时候,最好用 htmlspecialchars ,否则可能乱码。

**实际上上面的理解是错误的,因为htmlentities还有第三个编码的参数。
使用正确的编码,就可以消除上面的中文错误。如下:**

htmlentities 还有三个可选参数,分别是 charset、 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 转义掉,但是只要加上正确的编码作为参数,根本就不会出现所谓的中文乱码问题:

<code class="hljs bash has-numbering"><span class="hljs-variable">$str</span>=<span class="hljs-string">'<a href="test.html">测试页面</a>'</span>; 

<span class="hljs-built_in">echo</span> htmlentities(<span class="hljs-variable">$str</span>, ENT_COMPAT, <span class="hljs-string">'gb2312'</span>); 
// <a href=<span class="hljs-string">"test.html"</span>>测试页面</a>三人成虎,以讹传讹。 
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

** 结论:htmlentities 和 htmlspecialchars 的区别在于 htmlentities 会转化所有的 html character entity,而htmlspecialchars 只会转化手册上列出的几个 html character entity (也就是会影响 html 解析的那几个基本字符)。一般来说,使用 htmlspecialchars 转化掉基本字符就已经足够了,没有必要使用 htmlentities。实在要使用 htmlentities 时,要注意为第三个参数传递正确的编码。
**



来自  https://blog.csdn.net/daiyan_csdn/article/details/51636274




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

来自  https://www.cnblogs.com/zhaokai021/p/4573819.html




PHP中htmlentities和htmlspecialchars的区别

 

这两个函数的功能都是转换字符为HTML字符编码,特别是url和代码字符串。防止字符标记被浏览器执行。使用中文时没什么区别,但htmlentities会格式化中文字符使得中文输入是乱码

htmlentities转换所有的html标记,htmlspecialchars只格式化& ' " < 和 > 这几个特殊符号

 

复制代码
复制代码
$str = '<a href="demo.php?m=index&a=index&name=中文">测试页面</a>';

echo 'htmlentities指定GB2312编码:'.htmlentities($str,ENT_COMPAT,"GB2312").'';

echo 'htmlentities未指定编码:'.htmlentities($str).'';

$str = '<a href="demo.php?m=index&a=index&name=中文">测试页面</a>';

echo htmlspecialchars($str).'';
复制代码
复制代码

 

效果:

htmlentities指定GB2312编码:<a href="demo.php?m=index&a=index&name=中文">测试页面</a>

htmlentities未指定编码:<a href="demo.php?m=index&a=index&name=ÖÐÎÄ">²âÊÔÒ³Ãæ</a>

<a href="demo.php?m=index&a=index&name=中文">测试页面</a>

 

源代码:

htmlentities指定GB2312编码:&lt;a href=&quot;demo.php?m=index&amp;a=index&amp;name=中文&quot;&gt;测试页面&lt;/a&gt;<br/>htmlentities未指定编码:&lt;a href=&quot;demo.php?m=index&amp;a=index&amp;name=&Ouml;&ETH;&Icirc;&Auml;&quot;&gt;&sup2;&acirc;&Ecirc;&Ocirc;&Ograve;&sup3;&Atilde;&aelig;&lt;/a&gt;<br/>&lt;a href=&quot;demo.php?m=index&amp;a=index&amp;name=中文&quot;&gt;测试页面&lt;/a&gt;<br/>



来自  https://www.cnblogs.com/lbf1994/p/5734806.html

普通分类: