在PHP的开发过程中,我们往往需要对写入的数据或读取数据库的数据进行过滤后再进行写入或是读取。这样可以大大提高网站的整体安全性,预防一些非法的注入操作等。

今天就说一说,PHP中如何把预定义的字符串转换成HTML实体,来防止一些垃圾数据的提交。

PHP htmlspecialchars() 函数

htmlspecialchars():可以把预定义的字符转换为 HTML 实体。

语法:

htmlspecialchars(string,flags,character-set,double_encode)

参数:

string:必需。规定要转换的字符串。

flags:可选,规定如何处理引号、无效的编码以及使用哪种文档类型,如ENT_COMPAT、ENT_QUOTES、ENT_NOQUOTES

character-set:可选,顾名思义字符集,默认utf-8,当然支持很多编码,这里不列举

double_encode:可选,一个规定了是否编码已存在的 HTML 实体的布尔值。

例:PHP 输出转义后的html标签

示例1:

<?php
//飞鸟慕鱼博客
$str = "这是我的博客,网址是: <b>http://www.feiniaomy.com</b>";
//这里直接输出字符
echo $str;
echo '<br/>';
//输出转义后的字符
echo htmlspecialchars($str);
?>

输出结果,如下图所示:

QQ截图20190709122721.jpg

示例2:

<?php
//飞鸟慕鱼博客
$str = '这是我的博客,网址是: <span style="color:red;">http://www.feiniaomy.com</span>';
//这里直接输出字符
echo $str;
echo '<br/>';
//输出转义后的字符
echo htmlspecialchars($str);
?>

输出结果,如下图所示:

QQ截图20190709123839.jpg

注意:

1、在没有使用 htmlspecialchars() 函数前,字符串中的<b></b>是会被浏览器解析的

2、使用 htmlspecialchars() 函数后,字符串中<b></b>标签会被转义成实体,被HTML输出

3、上面的代码主要作用是: < (小于号)成为 <,>(大于号)成为 >

例:PHP 把双引号转换成HTML实体

示例1:

<?php
//飞鸟慕鱼博客
$str = '早安,世界!新的一天开始了,你做好"出去"准备了么?';
//这里直接输出字符
echo $str;
echo '<br/>';
//输出转义后的字符
echo htmlspecialchars($str,ENT_QUOTES);
?>

输出结果:

早安,世界!新的一天开始了,你做好"出去"准备了么?
早安,世界!新的一天开始了,你做好"出去"准备了么?

查看源码结果:

早安,世界!新的一天开始了,你做好"出去"准备了么?
<br/>
早安,世界!新的一天开始了,你做好&quot;出去&quot;准备了么?

注意:

1、通过查看源码可以发现,htmlspecialchars()函数把 "(双引号)转化了 &quot;

2、如果双引号的转换,htmlspecialchars() 函数的第二个参数应该设置为 ENT_QUOTES(转换双引号和单引号)

例:PHP把单引号转换成HTML实体

示例代码:

<?php
//飞鸟慕鱼博客
$str = "早安,'my words'!";
//这里直接输出字符
echo $str;
echo '<br/>';
//输出转义后的字符
echo htmlspecialchars($str,ENT_QUOTES);
?>

输出结果:

早安,'my words'!
早安,'my words'!

查看源码的结果:

早安,'my words'!<br/>
早安,&#039;my words&#039;!

注意:

1、php htmlspecialchars()函数会把单引号转换成 &#039;,并被浏览器输出

2、转换单号码,htmlspecialchars()函数的第二个参数值为 ENT_QUOTES(转换双引号和单引号)

补充:

HTML实体是什么?

1、在 HTML 中,某些字符是预留的。

2、在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签,当然在HTML中还有其他实体

3、如果希望正确地显示预留字符,我们必须在HTML源代码中使用字符实体(character entities)。

4、如需显示小于号,我们必须这样写:< 或 <使用实体名而不是数字的好处是,名称易于记忆。不过坏处是,浏览器也许并不支持所有实体名称(对实体数字的支持却很好)。

预定义的字符有哪些?

1、& (和号)成为 &

2、” (双引号)成为 ”

3、’ (单引号)成为 ‘

4、< (小于)成为 < > (大于)成为 >