目录
0x00 处理html标签的函数:
1.nl2br(字符串):
@让文本换行符\n在网页中产生换行效果。(其实就是将原文中\b全部替换成<br/>)
@返回值为可以产生换行效果的字符串。
<?php
$str = '我是第一行\n我是第二行';
$str2 = "我是第一行\n我是第二行";
echo $str;
echo $str2;
?>
注意:
1.只有双引号中的\n才会被解析,单引号将其看做字符串输出。
2.\n表示文本换行。所以被解析后只会在查看源代码时起作用。
网页中的显示:
右键查看源代码的显示情况:
如何让\n在网页中也产生换行效果呢?只要用nl2br转换一下即可。
<?php
$str = '我是第一行\n我是第二行';
$str2 = "我是第一行\n我是第二行";
echo $str;
echo $str2;
echo nl2br($str2);
echo str_replace('\n','<br/>',$str);
//相当于对str进行替换。注意这里如果换成str2的话不能实现换行效果,因为str2中\n已经被解析了。
?>
2.addslashes(字符串)
@给单引号、双引号、反斜线前加反斜线。
@返回转化后的字符串。
<?php
$str1 = 'I Love "xidian"';
echo addslashes($str1);
?>
常用于防sql注入
3.stripslashes(字符串):
@去掉反斜线
@返回转化后的字符串。
<?php
$str1 = 'I Love \"xidian"';
echo stripslashes($str1);
?>
4.htmlspecailchars(字符串)
@将 :
- &(和号)转成 &
- “(双引号)转成 "
- ‘(单引号)转成 ' 默认不进行转化,转化需要传入第二个参数ENT_QUOTES(实体_引号entity_quotes)
- <(小于号) 转成 <;
- >(大于号) 转成 &qt;
常用于防xss注入
@返回值为转化后的字符串
<?php
$str = "hello <script>alert('xss');</script>";
//echo $str;//如果直接echo 将会看到一个alert弹窗。
echo htmlspecialchars($str);
?>
网页效果:
查看源代码:
字符实体的作用:
比如说你想要设置输入栏中中的默认值为xidian's name ,第一种写法肯定不行,因为单引号会发生闭合。
这时,将单引号替换成它的字符实体,那么输入栏的默认值就会是xidian's
<?php
//echo "<input value = 'xidian's name'>";
echo "<input value = 'xidian's name'>";
?>
网页中的效果:
查看源代码:
5.htmlentities(字符串)
@可以将所有 有字符实体的特殊字符全部进行转换,而htmlspecialchars只能对以上5种特殊字符进行转化
@返回值为转换后的字符串。
6.strip_tags(字符串)
@将字符串中含有的html标签直接去除。注意htmlspecialchars是将标签的括号转化为实体(不会被解析),所以在网页中标签只是作为字符串输出了出来,没有消失。
@返回值为转换后的字符串。
<?php
$str = "hello <script>alert('xss');</script>";
//echo $str;
echo htmlspecialchars($str,ENT_QUOTES);
echo strip_tags($str);
?>
7.strcmp(字符串1,字符串2)
@如果字符串1小于字符串2 返回值小于0,如果相等 =0 否则 大于0(区分大小写)
@返回值为 int
<?php
$str1 = 'hello';
$str2 = 'Hello';
echo strcmp($str1,$str2);//32
?>
8.strcasecmp($str1,$str2)
@比较两个字符串,不区分大小写,其他同上。
@返回值为int类型
<?php
$str1 = 'hello';
$str2 = 'Hello';
echo strcasecmp($str1,$str2);
function myStrCaseCmp($str1,$str2){
return strtolower($str1) === strtolower($str2);
}
echo myStrCaseCmp($str1,$str2);
?>
9.strstr(字符串,子串)
@在字符串中查找子串的位置,如果找到了,就将该位置之后的所有字符组成的字符串返回。
@如果没有找到,则返回空。
<?php
$str1 = 'hello';
$str2 = 'll';
echo strstr($str1,$str2);//llo
?>
10.strpos(字符串,子串)
@在字符串中寻找子串
@返回子串的位置,如果没有找到则返回空。
strstr返回的是str strpos返回的是pos
<?php
$str1 = 'hello';
$str2 = 'llo';
echo strpos($str1,$str2);//2
?>
0x01 处理integer整型 的函数
1.abs(数字)
@取绝对值
@返回值为 int
2.bindec()
@二进制转十进制
<?php
echo bindec(1010);
?>
3.decbin()
@十进制转二进制
<?php
$b = 10;
echo decbin($b);
?>
4.floor()
@向下取整
5.ceil()
@向上取整
比说你有10条数据,每页显示3条,那么应该分多少页呢?这就要用到向上取整
<?php
$total =10;
$perPage = 3;
$numPage = ceil($total / $perPage);
?>
6.round()
@四舍五入
7.max(数组)
@返回数组中的最大值;
@max(数字,数字,数字。。。) 也可以
<?php
$arr = [12,323,32,45,666];
echo max($arr);
?>
8.min()
9.rand(起始数字,末尾数字)
@在指定区间生成一个随机数,并返回
例如:产生六位随机验证码
<?php
$num = rand(100000,999999);
echo $num;
?>
10.mt_rand(起始数字,末尾数字)
用法同上,功能也同上,但是效率比上面的函数快。推荐使用该函数。
0x02 处理float的函数
1.num_format(小数,保留小数点后多少位,'.',',')
@格式化输出小数
@返回值为string类型
<?php
$num = 123231244.24142133;
echo number_format($num,2,'.',',');//123,231,244.24
?>
0x03 重写strrev
<?php
$str = 'hello world';
function MyStrRev($str){
for($i =0;$i<strlen($str)/2;$i++){
$buff = $str[$i];
$str[$i] = $str[strlen($str)-$i-1];
$str[strlen($str)-$i-1] = $buff;
}
return $str;
}
echo MyStrRev($str);
?>
方法二:
<?php
$str = 'hello world';
function MyStrRev($str){
$ret = '';
$len = strlen($str) -1;
for($i = $len;$i>=0;$i--){
$ret.=$str[$i];
}
return $ret;
}
echo MyStrRev($str);
?>
中文处理版本:
<?php
$str = '你好';
function MyStrRev($str){
$ret = '';
$len = mb_strlen($str) -1;
for($i = $len;$i>=0;$i--){
$ret.=mb_substr($str,$i,1);
}
return $ret;
}
echo MyStrRev($str);
?>
0x04 手写MyStrSplit();
<?php
$slogan = 'hello world';
function MyStrSplit($str,$step = 1){
$list = [];
$index = 0;
for($i =0;$i<mb_strlen($str);$i+=$step){
$list[$index++] = mb_substr($str,$i,$step);
}
return $list;
}
var_dump(MyStrSplit($slogan,2));
?>
0x05 处理数组的系统函数
数组的定义五种方式复习:
<?php
$arr1 = array(1,2,3);
$arr2 = array('a'=>'1','b'=>'2','c'=>'3');
$arr3 = [1,2,3,'hello world'];//推荐
$arr4['a'] = 123;
$arr4['b'] = 222;
$arr5[] = 1;//$arr[0] =1;
$arr5[] = 2;//$arr[1] =2;
$arr5[] = 3;
?>
二维数组:
<?php
$arr =['a'=>[1,2,3],'b'=>[3,2,1]];
$arr1=[[1,2,3],c] //可以二维和一维混用
?>
0x06 数组的遍历:
1.count(数组)
@返回值为数组的长度
<?php
$arr = array(1,2,3);
for($i =0;$i<count($arr);$i++){
echo $arr[$i];
echo '<br/>';
}
?>
遍历二维数组:
<?php
$users = [
['username'=>'liudehua','age'=>'12'],
['username'=>'zhangyuhao','age'=>'33'],
['username'=>'liuyong','age'=>'32'],
];
for($i =0;$i<count($users);$i++){
echo $users[$i]['username'].'<br/>';
echo $users[$i]['age'].'<br/>';
}
?>
显然,for循环无法遍历关联数组,上例中我们通过自己枚举来遍历关联数组。
但是如果二维数组中数组的元素很多呢?
这就需要用到foreach了。
2.foreach:
foreach(数组名 as 键名=>值名){
}
将索引数组中的每一个元素(键值对)的键赋值给“键名”,值赋值给“值名”
键名 和 值名 可以自己随便命名。
<?php
$users = [
['username'=>'liudehua','age'=>'12'],
['username'=>'zhangyuhao','age'=>'33'],
['username'=>'liuyong','age'=>'32'],
];
for($i =0;$i<count($users);$i++){
foreach($users[$i] as $key=>$value){
echo $key.':'.$value.'<br/>';
}
}
?>
也可以直接省略键名,只取值名
foreach(数组名 as 值名)
总结:
for循环适合遍历索引数组
foreach 循环适合遍历关联数组,当然也可以用来遍历索引数组。
3.each(数组名)
传入一个数组,第一次调用返回第一个键值对,第二次调用返回第二个键值对。第三次调用返回第三个键值对。。。
返回的键值对实际上是一个包含了键和值的混合数组:
这个数组可以通过索引来访问键值:0 对应 键 1对应值
也可以通过关联的方式来访问:key 对应 键 value对应值
<?php
$users = [
['username'=>'liudehua','age'=>'12','pwd'=>'123456'],
['username'=>'zhangyuhao','age'=>'33'],
['username'=>'liuyong','age'=>'32'],
];
echo '<pre>';
var_dump(each($users[0]));
echo '<pre/>';
for($i =0;$i<3;$i++){
$ret = each($users[0]);
//通过索引数组的方式访问
echo $ret[0].'<br/>';
echo $ret[1].'<br/>';
//通过关联数组的方式访问
echo $ret['key'].'<br/>';
echo $ret['value'].'<br/>';
}
?>
4.list(变量1,变量2,变量3....) = 数组
将数组中的 索引变量 逐个赋值给 list中的变量。类似于解包.
<?php
$users = ['username'=>'wenmofen','pwd'=>'123','liudehua','apple'];
list($name,$fruit) = $users;
echo $name.'<br/>';
echo $fruit.'<br/>';
?>
list 可以和 each 结合使用
<?php
$users = ['username'=>'wenmofen','pwd'=>'123','liudehua','apple'];
list($key,$value) = each($users);
echo $key.'<br/>';
echo $value.'<br/>';
?>
<?php
$users = ['username'=>'wenmofen','pwd'=>'123','liudehua','apple'];
while(list($key,$value) = each($users)){
echo $key.'<br/>';
echo $value.'<br/>';
}
?>
0x07 9大预定义数组
1.$_SERVERS
该数组中存储和服务器相关的一系列信息,一共有79个键值对
array(30) {
["HTTP_HOST"]=>
string(14) "localhost:8888"
["HTTP_USER_AGENT"]=>
string(82) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0"
["HTTP_ACCEPT"]=>
string(63) "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
["HTTP_ACCEPT_LANGUAGE"]=>
string(59) "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"
["HTTP_ACCEPT_ENCODING"]=>
string(13) "gzip, deflate"
["HTTP_CONNECTION"]=>
string(10) "keep-alive"
["HTTP_UPGRADE_INSECURE_REQUESTS"]=>
string(1) "1"
["HTTP_CACHE_CONTROL"]=>
string(9) "max-age=0"
["PATH"]=>
string(29) "/usr/bin:/bin:/usr/sbin:/sbin"
["SERVER_SIGNATURE"]=>
string(0) ""
["SERVER_SOFTWARE"]=>
string(161) "Apache/2.2.34 (Unix) mod_wsgi/3.5 Python/2.7.13 PHP/7.3.1 mod_ssl/2.2.34 OpenSSL/1.0.2o DAV/2 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.9 Perl/v5.24.0"
["SERVER_NAME"]=>
string(9) "localhost"
["SERVER_ADDR"]=>
string(3) "::1"
["SERVER_PORT"]=>
string(4) "8888"
["REMOTE_ADDR"]=>
string(3) "::1"
["DOCUMENT_ROOT"]=>
string(25) "/Applications/MAMP/htdocs"
["SERVER_ADMIN"]=>
string(15) "[email protected]"
["SCRIPT_FILENAME"]=>
string(35) "/Applications/MAMP/htdocs/index.php"
["REMOTE_PORT"]=>
string(5) "52579"
["GATEWAY_INTERFACE"]=>
string(7) "CGI/1.1"
["SERVER_PROTOCOL"]=>
string(8) "HTTP/1.1"
["REQUEST_METHOD"]=>
string(3) "GET"
["QUERY_STRING"]=>
string(0) ""
["REQUEST_URI"]=>
string(1) "/"
["SCRIPT_NAME"]=>
string(10) "/index.php"
["PHP_SELF"]=>
string(10) "/index.php"
["REQUEST_TIME_FLOAT"]=>
float(1578043044.252)
["REQUEST_TIME"]=>
int(1578043044)
["argv"]=>
array(0) {
}
["argc"]=>
int(0)
}
几个重要的键值对:
1.OS:获取服务器操作系统的信息,我这台电脑上貌似没有这个键值对
2.HTTP_USER_AGENT:获取用户浏览器的相关信息。
3.SERVER_NAME:服务器的域名
4.SERVER_PORT:服务器的端口
5.SERVER_ADDR:服务器的ip地址
6.REMOTE_ADDR:用户的ip地址
7.DOCUMENT_ROOT:代码所在的文档根目录 Nginx配置文件中配置的根目录
8.SCRIPT_NAME:脚本名称
DOCUMENT_ROOT + SCRIPT_NAME = 脚本的绝对路径
2.$_ENV
array(16) {
["SHELL"]=>
string(9) "/bin/bash"
["TMPDIR"]=>
string(49) "/var/folders/tj/sjr_3yqn35g72vzjbwt3wcb80000gn/T/"
["Apple_PubSub_Socket_Render"]=>
string(48) "/private/tmp/com.apple.launchd.fFUKmuBgJz/Render"
["USER"]=>
string(3) "mac"
["COMMAND_MODE"]=>
string(8) "unix2003"
["SSH_AUTH_SOCK"]=>
string(51) "/private/tmp/com.apple.launchd.kqBWYDWHi6/Listeners"
["__CF_USER_TEXT_ENCODING"]=>
string(15) "0x1F5:0x19:0x34"
["PATH"]=>
string(29) "/usr/bin:/bin:/usr/sbin:/sbin"
["PWD"]=>
string(1) "/"
["XPC_FLAGS"]=>
string(3) "0x0"
["XPC_SERVICE_NAME"]=>
string(1) "0"
["HOME"]=>
string(10) "/Users/mac"
["SHLVL"]=>
string(1) "2"
["LOGNAME"]=>
string(3) "mac"
["SECURITYSESSIONID"]=>
string(5) "186a8"
["_"]=>
string(36) "/Applications/MAMP/Library/bin/httpd"
}
注:能不能打印出来$_ENV变量取决于php.ini配置文件中的variable_order = "EGPCS"中有没有E
G 表示 GET P:POST C:COOKIE S:表示SERVER
3.$_GET:
get传参:如果传递多个参数,参数之间用&隔开
传参时字符串不用加引号,可以直接写。
<!DOCTYPE html>
<head>
<meta charset = "utf-8">
</head>
<body>
<a href = './index2.php?a=111&b=123&c=xidian'>跳转到index2</a>
</body>
</html>
传参方式二:通过form表单传参
<!DOCTYPE html>
<head>
<meta charset = "utf-8">
</head>
<body>
<form action="./index2.php" method="get">
用户名:<input type="text" name="username"><br/>
密码:<input type = "text" name="pwd"><br/>
<input type="submit" value="提交"><br/>
</form>
</body>
</html>
点击提交后,form表单中的input框中 name 和 value 的值会组成键值对,传递给$_GET数组。
4.$_POST:
通常用来接收表单传参
5.$_REQUEST
不论是GET方法传参还是POST方法传参,$_REQUEST都可以接收。但是不推荐用,因为速度比较慢。
6.$_FILES
用于接收表单中上传文件的一些相关信息。
表单上传文件需注意:
1.必须用post方法
2表单必须加一个属性:enctype="mulitpart/form-data" 编码方式=“mulitpart/form-data”
<!DOCTYPE html>
<head>
<meta charset = "utf-8">
</head>
<body>
<form action="./index2.php" method="post" enctype = "multipart/form-data">
用户名:<input type="text" name="username"><br/>
密码:<input type = "text" name="pwd"><br/>
选择文件:<input type="file" name="file" id="">
<input type="submit" value="提交"><br/>
</form>
</body>
</html>
array(2) {
["username"]=>
string(9) "大萨达"
["pwd"]=>
string(6) "大叔"
}
array(1) {
["file"]=>
array(5) {
["name"]=>
string(13) "马中马.php"
["type"]=>
string(8) "text/php"
["tmp_name"]=>
string(36) "/Applications/MAMP/tmp/php/phpcGSrLo"
["error"]=>
int(0)
["size"]=>
int(71)
}
}
7.$GLOBALS
存储了包括自己在内的9个预定义数组。
同时,脚本中的全局变量也会存在$GLOBALS中,通过$GLOBALS可以将它“提升”为一个超全局变量。
例如:
<?php
$username = 'liudehua';
function printName(){
echo $username;//error 因为username是一个全局变量,作用域没有这么大
echo $GLOBALS['username'];//right!因为GLOBALS是一个超全局变量。
}
?>
注意:只有它没有下划线
array(5) {
["_GET"]=>
array(0) {
}
["_POST"]=>
array(2) {
["username"]=>
string(9) "大萨达"
["pwd"]=>
string(6) "大叔"
}
["_COOKIE"]=>
array(0) {
}
["_FILES"]=>
array(1) {
["file"]=>
array(5) {
["name"]=>
string(13) "马中马.php"
["type"]=>
string(8) "text/php"
["tmp_name"]=>
string(36) "/Applications/MAMP/tmp/php/phpjeiqMU"
["error"]=>
int(0)
["size"]=>
int(71)
}
}
["GLOBALS"]=>
array(5) {
["_GET"]=>
array(0) {
}
["_POST"]=>
array(2) {
["username"]=>
string(9) "大萨达"
["pwd"]=>
string(6) "大叔"
}
["_COOKIE"]=>
array(0) {
}
["_FILES"]=>
array(1) {
["file"]=>
array(5) {
["name"]=>
string(13) "马中马.php"
["type"]=>
string(8) "text/php"
["tmp_name"]=>
string(36) "/Applications/MAMP/tmp/php/phpjeiqMU"
["error"]=>
int(0)
["size"]=>
int(71)
}
}
["GLOBALS"]=>
*RECURSION*
}
}