php 特殊字符转义指南(函数用法、注意事项)
[編輯] [转简体] (简体译文)概要
正文
php 的转义函数有好多。
php 常用转义函数
列举:
htmlspecialchars 单双引号、大于和小于号等转化成HTML格式
htmlentities
将所有的字符都转为HTML格式
addslashes 单双引号、反斜线及NULL加上反斜线转义
mysqli_real_escape_string 转义 SQL 语句中使用的字符串中的特殊字符
这只是其中的一部分。
区别:
· htmlspecialchars :可以正确转义 HTML 字符为实体字符,比如 '<' 转为 "<"。
· htmlentities :转出来的结果是乱码?这我就不太熟悉了,好像要再使用 html_entity_decode() 函数解码才行,总之我没有使用。
· addslashes :可以用在执行 sql 语句前进行预处理,对特殊字符加上转义符号。
各个函数的使用场景,以及注意事项
表单提交到 php
form 表单的 input 和 textarea 控件得到的文本内容不会转码,也就是说,用户输入什么就是什么。比如用户输入个尖括号 '<',那么就会在 php 中得到尖括号。此时如果想要将获取到的文本内容输出到 HTML 中,就需要将这些字符转码为 HTML 实体字符,使用函数 htmlspecialchars。
然而,不止如此:用户输入的换行在 php 中得到的也是 '\n',如果要正常输出,就要转为 "<br/>"
还有空格,由于在 HTML 中,多个空格只会输出一个,所以必须使用 " " 来正常输出一定长度的空格。在 php 中也需要将获取到的文本内容中的空格都转为 " "。
类似 '\n'(换行) 和 ' '(空格)这样的字符需要手动转换才能正常输出,然而,或许还有更多字符需要手动转换,暂时不知道还有些什么,等以后发现吧,再补充。或许有哪里记录了这些需要手动转换的字符?但我不知道哪里有。
php 输出 js 语句
还有,输出 js 语句的时候,常常因为 '\n' 坏事。php 变量中的 '\n' 要输出到 js 代码中,必须转为 "\\n" 再输出。原因是显而易见的,请看下面的代码:
<?php $text = " hello world "; echo $text; echo "<script>alert('{$text}');</script>"; ?>
上面的代码按理来说应该输出一次带有换行的 "hello world" 到页面,并且出现一个 js 的页面弹窗显示带换行的 "hello world" 吧?
其实不然。因为 $text 中的换行是 '\n',经过 echo 语句输出到页面,script 标签中的语句也发生了换行,像是这样:
alert(' hello world ');
但是,js 的代码不允许这样写,字符串不能这样进行多行连接,也就是说,上面的代码会导致 js 的语法错误,导致页面不会出现弹窗。
正确的 js 代码应该是:
alert('\n hello\n world\n');
然而要想在 js 中输出真正的字符串 "\n" ,在 php 中就得再转义一次:
<?php $text = " hello world "; echo $text; // 将 $text 中的所有 '\n' 转为 "\\n" $text = str_replace("\n", "\\n", $text); echo "<script>alert('{$text}');</script>"; ?>
这样页面才会正常出现弹窗。
执行 sql 语句时
使用 mysqli_real_escape_string