php 的转义函数有好多。
PHP 常用转义函数
列举:
htmlspecialchars 单双引号、大于和小于号等转化成HTML格式
htmlentities
将所有的字符都转为HTML格式
addslashes 单双引号、反斜线及NULL加上反斜线转义
mysql_real_escape_string 转义 SQL 语句中使用的字符串中的特殊字符
这只是其中的一部分。
区别:
· htmlspecialchars :可以正确转义 HTML 字符为实体字符,比如 '<' 转为 "<"。
· htmlentities :转出来的结果是乱码?这我就不太熟悉了,好像要再使用 html_entity_decode() 函数解码才行,总之我没有使用。
· addslashes :可以用在执行 sql 语句前进行预处理,对特殊字符加上转义符号。
· mysql_real_escape_string :这个函数,似乎是 mysql 专门使用的字符转义函数,然而每次执行此函数我这都会出一个 Warning,而且中文乱码,不知道为什么。可以使用 mysqli_real_escape_string 代替此函数,但是需要多一个参数,就是连接数据库的返回值。如此看来,用这个函数的确比较麻烦,这个函数的功能可以使用 addslashes 函数代替。
各个函数的使用场景,以及注意事项
表单提交到 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 语句时
sql 语句的敏感字符应该只有引号,反斜杠了吧?用 addslashes 函数即可。