【web开发】PHP常用字符串格式函数(下)

举报
迷彩 发表于 2023/07/31 09:54:17 2023/07/31
【摘要】 前言HTML的输入表单和URL上附加资源是用户将数据提交给服务器的途径,如果不能很好地处理,就有可能成为黑客攻击服务器的入口。比如:用户在发布文章时,在文章中如果包含一些html格式的标记或javascript的页面转向等代码,直接输出显示则一定会是页面的布局发生改变,甚至调往非法网站,导致文章浏览者进入非法网站,更严重的甚至可能导致财产损失。因为这些代码被发送到浏览器中,浏览器会按有效的代...

前言

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实体.比如:将"<"转换为"&lt;",将">"转换为"&gt;".这样html标记浏览器就不会去解析,而是将html文本在浏览器中直接原样输出.PHP中提供的htmlspecialchars()函数就可以直接将一些预定义的字符转换为html实体.这个函数用在预防使用者提供的文字中包含了html的标记,像是布告栏或者是访客留言板或者是评论等这方面的应用.一下是htmlspecialchars()函数可以转换的字符:

"&(和号)"转为"&amp;"

"""(双引号)转为 "&quot;"

"'"(单引号)转为 "&#039;"

"<"(小于号)转为 "&lt;"

">"(大于号)转为 "&gt;"

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全部被删除。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。