htmlspecialchars() 函数把预约义的字符转换为 HTML 实体。php
预约义的字符是:html
& (和号)成为 &数据库
" (双引号)成为 "后端
' (单引号)成为 '浏览器
< (小于)成为 <函数
> (大于)成为 >测试
注意:这个函数不能对斜杠/,反斜杠\作处理。编码
示例:code
$content = '你是/谁啊,大几\都"老梁"作作&>women<a>没<script> alert("hello");</script>'; $content = htmlspecialchars($content); // 结果: 你是/谁啊,大几\都"老梁"作作&>women<a>没<script> alert("hello");</script> // 对反斜杠进行转换 $content = preg_replace("/\\\/", "\", $content); // 结果:你是/谁啊,大几\都"老梁 // 对斜杠进行过滤,入库时进行XSS检测攻击。 $content = preg_replace("/\//", "/", $content);
在 HTML 中,某些字符是预留的。
在 HTML 中不能使用小于号(<)和大于号(>),这是由于浏览器会误认为它们是标签。
若是但愿正确地显示预留字符,咱们必须在 HTML 源代码中使用字符实体(character entities)。
字符实体相似这样:
&entity_name;或者entity_number;htm
如需显示小于号,咱们必须这样写:< 或 <
提示:使用实体名而不是数字的好处是,名称易于记忆。不过坏处是,浏览器也许并不支持全部实体名称(对实体数字的支持却很好)。
htmlspecialchars(string,flags,character-set,double_encode)
flags 可选。规定如何处理引号、无效的编码以及使用哪一种文档类型。
可用的引号类型:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
character-set:
UTF-8 - 默认。ASCII 兼容多字节的 8 位 Unicode
POCO 的后端为GBK,因此用这个函数的时候,尽可能使用编码,而默认的编码为UTF-8
GB2312 - 简体中文,国家标准字符集
double_encode 可选。布尔值,规定了是否编码已存在的 HTML 实体。
TRUE - 默认。将对每一个实体进行转换。
FALSE - 不会对已存在的 HTML 实体进行编码。
示例:
$content = "women's life" . '你是/谁啊,大几\都"老梁"作作&>women<a>没<script> alert("hello");</script>'; // 若是使用默认的参数,则不会对单引号进行转换。 $new_str = htmlspecialchars($content ); 打印: women's life你是/谁啊,大几\都"老梁"作作&>women<a>没<script> alert("hello");</script> // ENT_QUOTES 编码双引号和单引号。 $new_str = htmlspecialchars($content, ENT_QUOTES); women's life你是/谁啊,大几\都"老梁"作作&>women<a>没<script> alert("hello");</script>
htmlspecialchars_decode(string,flags)
string 必需。规定要解码的字符串。
flags 可选。规定如何处理引号以及使用哪一种文档类型。
可用的引号类型:
ENT_COMPAT - 默认。仅解码双引号。
ENT_QUOTES - 解码双引号和单引号。
ENT_NOQUOTES - 不解码任何引号。
测试:
解码: $str = ‘women's life你是/谁啊,大几\都"老梁"作作&>women<a>没<script> alert("hello");</script>’; // 只解码双引号 $new_str = htmlspecialchars_decode($new_str); dump($new_str); 打印: women's life你是/谁啊,大几\都"老梁"作"作&>women<a>没<script> alert("hello");</script> // 解码双引号和单引号。 $content = "women's life" . '你是/谁啊,大几\都"老梁"作"作&>women<a>没<script> alert("hello");</script>'; $new_str = htmlspecialchars($content, ENT_QUOTES, gb2312, true); $new_str = htmlspecialchars_decode($new_str, ENT_QUOTES); print_r($new_str); 打印: women's life你是/谁啊,大几\都"老梁"作"作&>women<a>没<script> alert("hello");</script>
将上边的字符串预约义转为实体封装为一个方法,之后能够直接调用:
$str = "women's life" . '你是/谁啊,大几\都"老梁"作作&>women<a>没<script> alert("hello");</script>'; // 1.将经常使用的预约义字符转为实体 $new_str = htmlspecialchars($str, ENT_QUOTES, gb2312, true); // 2.替换反斜杠 $new_str = preg_replace("/\\\/", "\", $new_str); // 3.替换斜杠 $content = preg_replace("/\//", "/", $content); // 打印结果: women's life你是/谁啊,大几\都"老梁"作作&>women<a>没<script> alert("hello");</script>
编码-将HTML转为实体
/** * 将HTML转为实体 * @param string $str 须要处理的字符串 * @param string $charset 编码,默认为gb2312 * @return string */ function html_to_entities($str, $charset = "gb2312") { // 参数判断 if(empty($str)) return ""; // 1.将经常使用的预约义字符转为实体 $new_str = htmlspecialchars($str, ENT_QUOTES, $charset); // 2.替换反斜杠 $new_str = preg_replace("/\\\/", "\", $new_str); // 3.替换斜杠 $new_str = preg_replace("/\//", "/", $new_str); return $new_str; }
解码-将实体转为HTML
/** * 将实体转为HTML * @param string $str 须要处理的字符串 * @return string */ function entities_to_html($str) { // 参数判断 if(empty($str)) return ""; // 1.将实体转为预约义字符 $new_str = htmlspecialchars_decode($str, ENT_QUOTES); // 2.替换反斜杠实体 $new_str = str_replace("\", "\\", $new_str); // 3.替换斜杠实体 $new_str = str_replace("/", "/", $new_str); return $new_str; }
通常使用htmlspecialchars将字符串的预约义字符转为实体的时候,须要传递ENT_QUOTES参数,由于若是不传递参数,默认的只对双引号作转换,而单引号不作转换,这样不能起到防止SQL注入的风险,因此,正式用的时候,咱们但愿双引号和单引号及其余可能引发SQL注入的都须要进行实体转换,存入数据库,因此,之后在用这个函数处理的时候,应该传入ENT_QUOTES参数,而后再结合preg_replace方法将斜杠、反斜杠替换为实体,这样就完美了。