php html_entity_decode使用总结

时间:2022-11-16 12:40:18

在处理网页字符串的时候,尤其是做爬虫类的应用时,经常会涉及到要处理的字符串中包含html标签,现在对这类字符串的处理做一个小的总结:

有时候获取到的字符串中有html标签,在入库的时候出于安全的考虑通常会对这样的字符串做转义处理,例如:

$a = '<div><p>11111</p></div>';
$b = htmlentities($a);
file_put_contents('./a.txt',$b);
echo $b;

在网页上显示是这样的:<div><p>11111</p></div>

但是如果echo $a;那么网页上只会显示:11111

由此可见,如果不转义,那么字符串里面的html标签就会被解析(如果是恶意代码,就会被执行),转义后会被当做字符串输出。

在来看看被转义后的$b,

&lt;div&gt;&lt;p&gt;11111&lt;/p&gt;&lt;/div&gt;
如果要反转义$b,那么使用php函数html_entity_decode,例如:

$a = '<div><p>11111</p></div>';
$b = htmlentities($a);
$b = html_entity_decode($b);
file_put_contents('./a.txt',$b);
echo $b;
这时网页上显示11111,$b的值此时就是$a,

最近做了一个需求,像这种带html标签的字符串入库的时候需要转义保留,在页面上显示的时候在反转义。然而客户端需要这些数据的时候需要过滤掉这些html标签,所以给客户端的字符串需要过滤掉html标签,

$b = '&lt;div&gt;&lt;p&gt;11111&lt;/p&gt;&lt;/div&gt;'

返还给客户端的字符串,

$b = html_entity_decode($b);

过滤所有的html标签:

$pattern = array(

"@<script(.*?)</script>@is", //过滤掉js代码

"@<iframe(.*?)</iframe>@is",//过滤掉iframe

"@<style(.*?)</style>@is",//过滤掉css

"@<(.*?)>@is" //过滤html标签

);   

foreach($pattern as $k => $v){

$b = preg_replace($v,"",$b);

}

echo $b; //输出11111,html标签都被过滤掉了

有时候需要过滤掉某一个标签之外的其他html标签,那改怎么办呢?

"@<[^img](.*?)>@is" //过滤除了img标签之外的其他html标签