PHP -- 字符串相关函数(2)

获取字符串:

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);

把字符串变成数组:
image.png

还可以这样:

$stu = '张三a男a18a长沙';

$arr = explode('a', $stu);
print_r($arr);
image.png

\color{rgba(254, 67, 101, .8)}{str\_split()按长度分割,这个就不是按分割符分割了}

$str = 'dfgertjrwsdfwer';

$arr = str_split($str, 3);
print_r($arr);
image.png

上面这个函数如果处理中文就会有问题了,还是编码的问题,用数字取值的话,取中文会乱码,所以这个函数用得少

chunk_split();将字符串分割成小块

$str = 'dfgertjrwsdfwer';

echo chunk_split($str, 3, '#');//每隔三个字符插入一个字符

image.png

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);,不知道字符串的情况下,可以这样写
image.png

============================================
substr中文的情况:

$str = '乏味和染发膏气温也如何';
echo substr($str, 0, 3);
image.png

3正好是utf-8编码下一个字的长度,所以只能截取一个中文字
如果值不是3,给4的话:
第二个字就乱码了


image.png

中英文都能截就要用mb_substr();

$str = '千好人干哈是无法对娃儿去如何如何';
echo mb_substr($str, 0, 4,'utf-8');
//substr(string, start);截取英文字符串,截中文会乱码
//mb_substr();中英文都可以,最后的编码高版本不用写,低版本要写,因为低版本默认使用系统编码
image.png

字符转义函数

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 = '<h1>hello</h1><a href="">百度</a><script>alert("132")</script>';
//这里是会直接运行,如果是html标签还好,如果是js标签或其他的东西运行了可能会造成一些麻烦
//这里想要他不执行的话,就要用htmlspecialchars()函数了

echo $str;

htmlspecialchars  html-special-chars实际是由三个单词组成,chars:字符
 */

$str = '<h1>hello</h1><a href="">百度</a><script>alert("132")</script>';
echo htmlspecialchars($str);

$str没有运行,输出的是符号实体,而不是标签渲染后的结果
符号实体其实就是&nbsp;等符号
image.png

htmlspecialchars_decode();解码htmlspecialchars

$str = '&lt;h1&gt;hello&lt;/h1&gt;&lt;a href=&quot;&quot;&gt;百度&lt;/a&gt;&lt;script&gt;alert(&quot;132&quot;)&lt;/script&gt;';
echo htmlspecialchars_decode($str);//htmlspecialchars_decode:解码htmlspecialchars,,这两个函数作用正好相反

$str的值就是上面htmlspecialchars的原码,通过htmlspecialchars_decode解码之后,会输出一个警告框,然后是hello和百度的链接

image.png

===================================================
strip_tags 过滤html和php标签

$str = '<h1>hello</h1><a href="">百度</a><script>alert("132")</script>';
echo strip_tags($str);
//echo strip_tags($str, <h1><a>);这样写的话,h1标签和a标签会被渲染,其他的标签依然会被过滤掉,要保留几个就写几个

过滤掉标签之后,直接输出其中的内容
image.png

字符串的比较
实际中一般用大于小于号,不用函数

int strcmp($str1, $str2);(字符串比较)
strcasecmp()同上(不区分大小写)


字符串转换函数

strtolower($str)字符串转换为小写(常用)
strtoupper($str)字符串转换为大写(常用)

ucfirst($str)将字符串的第一个字符转换为大写
ucwords($str)将每个单词的首字母转换为大写

\color{rgba(254, 67, 101, .8)}{将字符全部转为大写:}

$code = 'AzdjJ';
$str = 'azdj';
echo strtoupper($str);
    
image.png

\color{rgba(254, 67, 101, .8)}{将字符全部转为小写:}

$code = 'AzdjJ';
$str = 'azdj';
echo strtolower($str);
image.png

\color{rgba(254, 67, 101, .8)}{验证两个字符串是否相等:}
\color{rgba(254, 67, 101, .8)}{方法一:}

$code = 'AzdjJ';
$str = 'azdj';
if(strcasecmp($code, $str) != 0){
    //strcasecmp — 二进制安全比较字符串(不区分大小写)
    //如果 str1 小于 str2 返回 < 0;如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
    echo '验证码不正确';
}else{
    echo '验证码正确';
}
image.png

\color{rgba(254, 67, 101, .8)}{方法二}

$code = 'AzdjJ';
$str = 'azdj';
if(strtolower($code) != strtolower($str)){//全部转为大写或小写再比较
    echo '验证不正确';
}else{
    echo '验证码正确';
}
image.png

\color{rgba(3, 101, 100, .8)}{将每一个单词的首字母变成大写:}

$str = 'helllo world!  welcome to china';
echo ucwords($str);//将每一个单词的首字母变成大写

这个函数是按空格来区分单词的,单词之间如果是逗号没有空格他都不能区分
image.png

习题:

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'],
];

查找李雷是否存在


\color{rgba(254, 67, 101, .8)}{答案:}

\color{rgba(3, 101, 100, .8)}{第一题:}
\color{rgba(3, 101, 100, .8)}{第一种写法用for循环}

//封装一个函数获取指定长度(比如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();

这段代码每次返回的四个值都不同(类似输入验证码)
image.png

\color{rgba(3, 101, 100, .8)}{第二种写法不用for循环}

//封装一个函数获取指定长度(比如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循环,这一种全部用系统函数
推荐使用这一种写法
image.png

第三种写法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(纯数字)

// 这段代码每次返回的值都不同(类似输入验证码)
image.png

\color{rgba(254, 67, 101, .8)}{前面的写法最大只能取10个随机数,要取更多数的情况:}

//封装一个函数获取指定长度(比如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(纯数字)

// 这段代码每次返回的值都不同(类似输入验证码)
image.png

\color{rgba(254, 67, 101, .8)}{例题2}
\color{rgba(3, 101, 100, .8)}{封装一个函数获取一个文件名的类型,如有一个文件名为123.jpg的图片得到.jpg的后缀}


\color{rgba(254, 67, 101, .8)}{第二个例题:}
封装一个函数获取一个文件名的类型,如有一个文件名为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, '.'); 
image.png

\color{rgba(254, 67, 101, .8)}{例题三:}

封装一个函数来在学生信息的数组中查找一个学生是否存在,如果存在返回这个学生的信息,否则返回查无此人
学生信息的数组样式如下:

$class = [
['name'  => '张三', 'gender'  => '男', 'age'  => '18'],
['name'  => '李四', 'gender'  => '男', 'age'  => '19'],
['name'  => '李雷', 'gender'  => '男', 'age'  => '20'],
['name'  => 'Lucy', 'gender'  => '女', 'age'  => '17'],
];

查找李雷是否存在

\color{rgba(254, 67, 101, .8)}{第三例答案:}

/* 封装一个函数来在学生信息的数组中查找一个学生是否存在,如果存在返回这个学生的信息,否则返回查无此人
    学生信息的数组样式如下:

$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;

image.png

$name的值(要查找的人)为Lili时:

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容