【web开发】PHP常用字符串格式函数(下)
前言
HTML的输入表单和URL上附加资源是用户将数据提交给服务器的途径,如果不能很好地处理,就有可能成为黑客攻击服务器的入口。比如:用户在发布文章时,在文章中如果包含一些html格式的标记或javascript的页面转向等代码,直接输出显示则一定会是页面的布局发生改变,甚至调往非法网站,导致文章浏览者进入非法网站,更严重的甚至可能导致财产损失。因为这些代码被发送到浏览器中,浏览器会按有效的代码去解释。所以在PHP脚本中,对用户提交的数据内容一定要先处理。再PHP中为我们提供了非常全面的html相关的字符串格式化函数,可以有效地控制html文本的打印输出.
1.函数nl2br详细解析
在浏览器中输出的字符串只能通过html的"<br>"标记换行,而很多人习惯使用"\n"作为换行符,但浏览器中无法识别这个字符串的换行符,即使是很多行,在浏览器中显示时也只有一行,nl2br()函数就是在字符串中的每个新行"\n"之前插入html换行符"<br>". 此函数使用语法如下:
<?php
$str = "这是一段需要展示换行的文本:\n文本内容如下\nXXXX";
echo "原字符串:".$str;
echo "<br>";
echo nl2br($str);
echo "<br>\n";
?>
执行结果如下:
浏览器查看源码如下:
2.函数htmlspecialchars()的使用详细解析
如果不希望浏览器直接解析html标记,就需要将html标记中的特殊字符转换成html实体.比如:将"<"转换为"<",将">"转换为">".这样html标记浏览器就不会去解析,而是将html文本在浏览器中直接原样输出.PHP中提供的htmlspecialchars()函数就可以直接将一些预定义的字符转换为html实体.这个函数用在预防使用者提供的文字中包含了html的标记,像是布告栏或者是访客留言板或者是评论等这方面的应用.一下是htmlspecialchars()函数可以转换的字符:
"&(和号)"转为"&"
"""(双引号)转为 """
"'"(单引号)转为 "'"
"<"(小于号)转为 "<"
">"(大于号)转为 ">"
htmlspecialchars()函数原型如下:
string htmlspecialchars(string string [, int quote_style [, string charset]])
该函数中的第一个参数是带有html标记待处理字符串,为必选参数,第二个参数是可选参数,用来决定引号的转换方式,默认值为ENT_COMPAT将只转换双引号,而保留单引号,ENT_QUOTES将同时转换这两种引号;而ENT_NOQUOTES将不对引号进行转换.第三个参数也是可选值,用于指定所处理字符串的字符集,默认的字符集是ISO 8859-1.其他可以使用的合法字符集如下图:
注:在 PHP 5.4 之前的版本,无法被识别的字符集将被忽略并由 ISO-8859-1 替代。自 PHP 5.4 起,无法被识别的字符集将被忽略并由 UTF-8 替代。
无法识别的字符集将被忽略,并由默认字符集ISO 8859-1代替,该函数的基本使用方法如下:
<html>
<head>
<title>
html页面
</title>
</head>
<body>
<?php
$str = "<B>名字:</B> & 张 & 三";
echo "用户输入的字符串为:" . $str . "<br>";
echo htmlspecialchars($str, ENT_COMPAT) . "<br>";
echo htmlspecialchars($str, ENT_QUOTES) . "<br>";
echo htmlspecialchars($str, ENT_NOQUOTES) . "<br>";
?>
</body>
</html>
在浏览器中的输出结果是:
如果在浏览器中查看源码如下面这样:
在PHP中还提供了htmlentities()函数,可以将所有的非ASCII码字符转换为对应的实体代码,该函数与htmlspecialchars()函数的使用语法格式一致,但是该函数可以转义更多的html字符.下面我们通过实际例子来了解它的的相关用法:
<?php
$str = "这个 'quote' 是 <b>字体加粗</b>";
echo htmlentities($str);
echo "<br>\n";
echo htmlentities($str, ENT_QUOTES, "UTF-8");
?>
执行结果如下:
浏览器查看源码如下:
在处理表单中提交的数据时,不仅要通过前面介绍的函数将html的标记符号和一些特殊字符转换为html实体标记,还需要对引号进行处理,因为被提交的表单数据中的“'”,“"”,“\”等字符前将被自动加上加上一个斜线“\”。这是由于PHP配置文件php.ini中的选项magic_quotes_gpc在起作用,默认是打开的,如果不关闭它则要使用stripslashes()删除反斜线.如果不处理,将数据保存到数据库中时,有可能会被数据库误当成控制符号而引起错误.函数stripslashes()只有一个被处理的字符串作为参数,返回处理后的字符串。通常使用htmlspecialchars()函数与stripslashes()函数复合的方式,联合处理表单中提交的数据:
<html>
<head>
<title>
html页面
</title>
</head>
<body>
<form action="" method="post">
请输入字符串:<br>
<input type="text" size="50" name="str" value="<?=html2Text($_POST['str'])?>">
<input type="submit" name="submit" value="提交数据">
</form>
<?php
if(isset($_POST['submit'])){
echo "用户输入的字符串为:" . $_POST['str'] . "<br>";
echo "转换为html实体:" . htmlspecialchars($_POST['str']) . "<br>";
echo "删除字符串中的斜线:" . stripcslashes($_POST['str']) . "<br>";
echo "删除字符串中的斜线以及转换为html实体:" . html2Text($_POST['str']) . "<br>";
}
function html2Text($str){
return htmlspecialchars(stripcslashes($str));
}
?>
</body>
</html>
执行结果如下:
在上例中,通过在表单转给你输入带有html标记和引号的字符串,提交给PHP脚本输出,分别将其直接输出给浏览器解析,使用htmlspecialchars()函数转换html标记符号,使用stripslashes()函数删除引号前的反斜线,最后使用htmlspecialchars()函数和stripslashes()函数的复合方式删除引号前的反斜线,又将html的标记符号转换为实体.
函数stripslashes()的功能是去掉反斜线"\",如果有连续两个反斜线,则只去掉一个,与之对应的是另一个函数addslashes(),正如函数名所表示的一样,他将在“'”,“"”,“\”和NULL等字符前增加必要的反斜线.
函数htmlspecialchars的功能是将html中的标记符号转换为对应的html实体,有时候直接删除用户输入的html标签也是非常必要的,PHP中提供的strip_tags()函数默认就可以删除字符串中所有的html标签,也可以有选择性地删除一些html标签,如公告栏或者评论区,有这方面的应用是相当必要的.比如:用户在博客或者论坛中发布文章时,可以预留一些可以改变文字字体大小,颜色,粗细和斜体等等html标签,而删除一些对页面布局有影响的html标签.strip_tags()的函数原型如下:
string strip_tags(string str [, string allowable_tags])
该函数有两个参数:第一个参数提供了要处理的字符串,是必选项;第二个参数是一个可选的html标签列表,放入该列表中的html标签将被保留,其他的则全部被删除.默认将所有的html标签都删除.下面通过实例看看如何使用:
<?php
$str = "<font color='red' size='10'>张三</font> <i>12岁</i> <u>男</u> <b>汉族</b>";
echo $str;
echo "<br>";
echo strip_tags($str);
echo "<br>";
echo strip_tags($str, "<font>");
echo "<br>";
echo strip_tags($str, "<b><u><i>");
执行结果如下:
在上面的程序中,第一次使用strip_tags()函数时,没有输入第二个参数,所以删除了所有的html标签.第二次使用strip_tags()函数时,在第二个参数输出了"<font>"标签,则其他的html标签全部被删除.第三个使用strip_tags()函数时,在第二个参数中输入"<b><u><i>"三个html标签组成的列表,则这三个标签将被保留,而其他的html全部被删除。
- 点赞
- 收藏
- 关注作者
评论(0)