获取字符串:
mb_substr — 获取部分字符串
substr — 返回字符串的子串
分割、链接、反转函数:
str_split($str, len):把$str按le长度进行分割返回数组
chunk_split — 将字符串分割成小块
split(search, $str[, int]):把$str按search字符进行分割返回数组,int是分割几次,后面的将不分割
strrev(string $string)返回 反转后的字符串
常用的是这两个:
这两个函数作用正相反:
explode(search, $str[, int])把字符串变成数组,前面必须要有分割符
implode 将数组用特定的分割符转变为字符串,分割符要不要都可以
$stu = '张三,男,18,长沙';
$arr = explode(',', $stu);
print_r($arr);
把字符串变成数组:
还可以这样:
$stu = '张三a男a18a长沙';
$arr = explode('a', $stu);
print_r($arr);
$str = 'dfgertjrwsdfwer';
$arr = str_split($str, 3);
print_r($arr);
上面这个函数如果处理中文就会有问题了,还是编码的问题,用数字取值的话,取中文会乱码,所以这个函数用得少
chunk_split();
将字符串分割成小块
$str = 'dfgertjrwsdfwer';
echo chunk_split($str, 3, '#');//每隔三个字符插入一个字符
substr英文的情况:
$str = 'abcdefghijk';
echo substr($str, 3, -1);
//substr(string, start);截取字符串,完整的写法是三个参数
//第一个参数是从哪个变量截
//第二个是从这个变量的字符串的哪个索引(字符的位置)开始截
//第三个参数是截多少个字符,第三个参数不写的话全部截完
//substr($str, 3, -1);这样写的话,是从d开始截,截到倒数第二个j结束,最后一个k就没有了
//substr($str, -3);这样写的话,返回值是:ijk,从第-3个开始截
//substr($str, -3);还可以这样写:substr($str, strlen($str)-3);,不知道字符串的情况下,可以这样写
============================================
substr中文的情况:
$str = '乏味和染发膏气温也如何';
echo substr($str, 0, 3);
3正好是utf-8编码下一个字的长度,所以只能截取一个中文字
如果值不是3,给4的话:
第二个字就乱码了
中英文都能截就要用mb_substr();
$str = '千好人干哈是无法对娃儿去如何如何';
echo mb_substr($str, 0, 4,'utf-8');
//substr(string, start);截取英文字符串,截中文会乱码
//mb_substr();中英文都可以,最后的编码高版本不用写,低版本要写,因为低版本默认使用系统编码
字符转义函数
stripslashes(string $str)
get_magic_quotes_gpc()
htmlentities——将字符串中所有可转换字符转换为HTML实体
下面几个比较常用:
addslashes(string $str) 使用反斜线引用字符串 abc'd => abc'相当于使用转义符转义,这个函数做数据库的时候会用,
htmlspecialchars 将特殊字符转换为 HTML 实体
htmlspecialchars decode ——htmlspecialchars()函数的反函数,将HTML实体转换为字符
strip_tags 过滤html和php标签
=======================================================
htmlspecialchars();
/* $str = 'hello
百度';
//这里是会直接运行,如果是html标签还好,如果是js标签或其他的东西运行了可能会造成一些麻烦
//这里想要他不执行的话,就要用htmlspecialchars()函数了
echo $str;
htmlspecialchars html-special-chars实际是由三个单词组成,chars:字符
*/
$str = 'hello
百度';
echo htmlspecialchars($str);
$str没有运行,输出的是符号实体,而不是标签渲染后的结果
符号实体其实就是 等符号
htmlspecialchars_decode();
解码htmlspecialchars
$str = '<h1>hello</h1><a href="">百度</a><script>alert("132")</script>';
echo htmlspecialchars_decode($str);//htmlspecialchars_decode:解码htmlspecialchars,,这两个函数作用正好相反
$str的值就是上面htmlspecialchars的原码,通过htmlspecialchars_decode解码之后,会输出一个警告框,然后是hello和百度的链接
===================================================
strip_tags
过滤html和php标签
$str = 'hello
百度';
echo strip_tags($str);
//echo strip_tags($str, );这样写的话,h1标签和a标签会被渲染,其他的标签依然会被过滤掉,要保留几个就写几个
过滤掉标签之后,直接输出其中的内容
字符串的比较
实际中一般用大于小于号,不用函数
int strcmp($str1, $str2);(字符串比较)
strcasecmp()同上(不区分大小写)
字符串转换函数
strtolower($str)字符串转换为小写(常用)
strtoupper($str)字符串转换为大写(常用)
ucfirst($str)将字符串的第一个字符转换为大写
ucwords($str)将每个单词的首字母转换为大写
$code = 'AzdjJ';
$str = 'azdj';
echo strtoupper($str);
$code = 'AzdjJ';
$str = 'azdj';
echo strtolower($str);
$code = 'AzdjJ';
$str = 'azdj';
if(strcasecmp($code, $str) != 0){
//strcasecmp — 二进制安全比较字符串(不区分大小写)
//如果 str1 小于 str2 返回 < 0;如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
echo '验证码不正确';
}else{
echo '验证码正确';
}
$code = 'AzdjJ';
$str = 'azdj';
if(strtolower($code) != strtolower($str)){//全部转为大写或小写再比较
echo '验证不正确';
}else{
echo '验证码正确';
}
$str = 'helllo world! welcome to china';
echo ucwords($str);//将每一个单词的首字母变成大写
这个函数是按空格来区分单词的,单词之间如果是逗号没有空格他都不能区分
习题:
1.封装一个函数获取指定长度(比如4位)的随机字符串
function get_rand_str($len=4){}
2.封装一个函数获取一个文件名的类型,如有一个文件名为123.jpg的图片得到.jpg的后缀
3.封装一个函数来在学生信息的数组中查找一个学生是否存在,如果存在返回这个学生的信息,否则返回查无此人
学生信息的数组样式如下:
$class = [
['name' => '张三', 'gender' => '男', 'age' => '18'],
['name' => '李四', 'gender' => '男', 'age' => '19'],
['name' => '李雷', 'gender' => '男', 'age' => '20'],
['name' => 'Lucy', 'gender' => '女', 'age' => '17'],
];
查找李雷是否存在
//封装一个函数获取指定长度(比如4位)的随机字符串
//array_merge — 合并一个或多个数组
//range — 根据范围创建数组,包含指定的元素
//shuffle — 打乱数组
function get_rand_str($len=4){
$arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));//先创建一个数组
shuffle($arr);//然后打乱数组
$str = '';//创建一个装新数组的空数组,下面的for循环取得的数就装在这里面
for($i=0;$i<$len;$i++){
$str .= $arr[$i];
//把前面已经打乱的数组的前四个赋给$str
//这里有一个问题是,每取一次值,前面的数组都会被重新打乱一次
//因为shuffle函数在for循环之前
}
return $str;
}
echo get_rand_str();
这段代码每次返回的四个值都不同(类似输入验证码)
//封装一个函数获取指定长度(比如4位)的随机字符串
//array_slice — 从数组中取出一段
function get_rand_str($len=4){
$arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));//先创建一个数组
shuffle($arr);//然后打乱数组
$sub_arr = array_slice($arr, 0, $len);// 先在原本的数组中截取一段,第一个参数是要截取的数组,第二个参数是从0开始截取,第三个参数是截取多少个元素
$str = implode('',$sub_arr);
return $str;
}
echo get_rand_str(5);
//这里如果不给参数,那么就输出四个随机字符串
//如果给了参数,那就按照这里给的数输出
这段代码每次返回的值都不同(类似输入验证码)
这段代码和第一种的效果相同,区别是第一种用for循环,这一种全部用系统函数
推荐使用这一种写法
第三种写法switch
//封装一个函数获取指定长度(比如4位)的随机字符串,1纯数字,2纯字母,3混合
function get_rand_str($len=4, $style = 1){
$arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));//先创建一个数组
switch($style){
case 1:$arr = range(0, 9); break;
//纯数字
case 2:$arr = array_merge(range('a', 'z'), range('A', 'Z'));break;
//纯字母
case 3:$arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));break;
//数字字母混合
default:$arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));
//其他可能性
}
shuffle($arr);//然后打乱数组
$sub_arr = array_slice($arr, 0, $len);// 先在原本的数组中截取一段,第一个参数是要截取的数组,第二个参数是从0开始截取,第三个参数是截取多少个元素
$str = implode('',$sub_arr);
return $str;
}
echo get_rand_str(6,2);//第二个参数写几,就输出第几个case,不写默认输出第一个case(纯数字)
// 这段代码每次返回的值都不同(类似输入验证码)
//封装一个函数获取指定长度(比如4位)的随机字符串,1纯数字,2纯字母,3混合
function get_rand_str($len=4, $style = 1){
$arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));//先创建一个数组
switch($style){
case 1:$arr = range(0, 9); break;
//纯数字
case 2:$arr = array_merge(range('a', 'z'), range('A', 'Z'));break;
//纯字母
case 3:$arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));break;
//数字字母混合
default:$arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));
//其他可能性
}
$count = count($arr);//之前的写法有弊端,就是取值不会超过10个数,如果参数大于10,也只能取出10个随机数,所以这里要判断一下
if($count >= $len){
shuffle($arr);//打乱数组
$sub_arr = array_slice($arr, 0, $len);//如果要取的值小于10就这样
}else{//如果要取的值大于10:
$n = intval($len/$count);//取整,要取的长度除以数组的长度,这里如果直接写实参25的话,就写死了
//比如此例,要取25和随机数,但是最多只能取10个数,就是25/10,结果2.5取整就是2
$m = $len%$count;//取余数,上面取了函数实参的十位,现在取个位
$sub_arr = [];
for($i=0;$i<$n;$i++){
shuffle($arr);
$sub_arr = array_merge($sub_arr, $arr);
}
if($m > 0){
shuffle($arr);//再打乱一次,取到的数更随机了
$sub_arr = array_merge($sub_arr,array_slice($arr, 0, $m));//大于0就截取相应位数的元素,等于0就不用截取了,这里不加array_merge的话,前面的20个随机数就会被覆盖掉
}
//die();函数:die();终止代码执行等同于 => exit();输出一个消息并且退出当前脚本
}
$str = implode('',$sub_arr);
return $str;
}
echo get_rand_str(25);//第二个参数写几,就输出第几个case,不写默认输出第一个case(纯数字)
// 这段代码每次返回的值都不同(类似输入验证码)
封装一个函数获取一个文件名的类型,如有一个文件名为123.jpg的图片得到.jpg的后缀
封装一个函数获取一个文件名的类型,如有一个文件名为123.jpg的图片得到.jpg的后缀
第一种方法:
$str = 'sdf.sdfer.123.jpg';
echo strrchr($str, '.');
strrchr — 查找指定字符在字符串中的最后一次出现这个函数可以获取到.jpg
而且几遍文件前面还有 点 也不会影响结果
第二种方法:写一个函数,但是还是用的strrchr();
$str = 'sdf.sdfer.123.jpg';
function get_suffix($str){//suffix:后缀
return strrchr($str, '.');
}
echo strrchr($str, '.');
封装一个函数来在学生信息的数组中查找一个学生是否存在,如果存在返回这个学生的信息,否则返回查无此人
学生信息的数组样式如下:
$class = [
['name' => '张三', 'gender' => '男', 'age' => '18'],
['name' => '李四', 'gender' => '男', 'age' => '19'],
['name' => '李雷', 'gender' => '男', 'age' => '20'],
['name' => 'Lucy', 'gender' => '女', 'age' => '17'],
];
查找李雷是否存在
/* 封装一个函数来在学生信息的数组中查找一个学生是否存在,如果存在返回这个学生的信息,否则返回查无此人
学生信息的数组样式如下:
$class = [
['name' => '张三', 'gender' => '男', 'age' => '18'],
['name' => '李四', 'gender' => '男', 'age' => '19'],
['name' => '李雷', 'gender' => '男', 'age' => '20'],
['name' => 'Lucy', 'gender' => '女', 'age' => '17'],
];
查找李雷是否存在 */
/* 思路:
1.先构建一个函数,查找学生在哪个班级,以及要找的学生姓名(形参)
2.在函数中会返回找到的信息
3.构建班级信息
4.给出要超找的人名(李雷)
5.将要查找的人名放到构建好的函数中(实参),并赋值一个变量接收这个返回值
6.输出这个变量的值,大概结构如下:
function find_student($class, $name){
return '';
}
$class = [
['name' => '张三', 'gender' => '男', 'age' => '18'],
['name' => '李四', 'gender' => '男', 'age' => '19'],
['name' => '李雷', 'gender' => '男', 'age' => '20'],
['name' => 'Lucy', 'gender' => '女', 'age' => '17'],
];
$name = '李雷';
$ret = find_student($class. $name);
echo $ret; */
function find_student($class, $name){
$result = [];//建一个数组接收下面循环返回的结果
foreach($class as $student){ //每次循环,将$class的值赋给$student
if($student['name'] == $name){
//判断:如果循环到的值等于给定的实参(这就证明找到了),就把值传给$result
$result = $student;
break;
}
}
if(empty($result)){
//上面的if是判断找到的情况,这个if是判断没有找到的情况
//上一个if的值会作为实参传给这个if做判断
//如果没有找到,就输出查无此人,有就输出result,所以这个if和foreach同层级
//empty — 检查一个变量是否为空
//也可以这样写:if(cont($result) == 0){}等于result没有接收到值,那么就是没有找到结果
$ret = '查无此人';
}else{
$ret = implode(',', $result);
//implode — 将一个一维数组的值转化为字符串
//在这里是将得到的值(一个数组)转换为字符串的形式输出.中间用逗号隔开
}
return $ret;
//这个return是作为函数的返回值返回,而不是if的返回值返回
//下面echo会接收到这个值并输出
}
$class = [
['name' => '张三', 'gender' => '男', 'age' => '18'],
['name' => '李四', 'gender' => '男', 'age' => '19'],
['name' => '李雷', 'gender' => '男', 'age' => '20'],
['name' => 'Lucy', 'gender' => '女', 'age' => '17'],
];
$name = '李雷';
$ret = find_student($class, $name);
echo $ret;
$name
的值(要查找的人)为Lili
时: