php学习笔记-php字符串及字符串常用函数总结-day04

简介: 本文总结了PHP中字符串的三种定义方式和常用字符串处理函数,包括字符串的修剪、转换、长度计算、子串操作、比较、连接、分割及替换等操作。

php字符串的三种定义方式

作为web开发语言,php最常打交道的数据类型就是字符串,所以如何灵活的处理字符串是十分重要的。

字符串最简单的指定方式就是使用单引号'或者双引号"以及定界符去指定字符串。

1.单引号

在单引号中的字符串,会被逐个字符来处理。

在单引号中 \ 还是被当作转义字符来处理,比如 \'被转换为\,双斜杠\\被转换为\

    $str1 = '你好呀';
    $say1 = '小白\'$str1\\n!!!!';
    echo $say1."\n";//小白'$str1\n!!!!

2.双引号

使用双引号字符串会花费php预处理器的处理时间,所以更推荐单引号的方式。

双引号中的特殊字符,也其实就是转义字符,换行符,回车符,制表符这些,与其他高级语言保持一致。

双引号中的特殊字符序列 转义后的字符
\ 反斜杠
\n 换行符
\r 回车符
\t 制表符
    $str2 = "哈哈哈哈,晚上好!";
    $say2 = "小白$str2";
    echo $say2."\n";//小白哈哈哈哈,晚上好!
    $say2 = "小白$str23123";//这里是因为php预处理器不知道这个变量到哪里结束
    echo $say2."\n";//出错,只会输出小白

通过使用插槽{}的方式,来说明变量的起止位置,和python一样,mustache语法也差不多

    $say2 = "小白{$str2},马上过年啦!";
    echo $say2."\n";//小白哈哈哈哈,晚上好!,马上过年啦!

3.定界符

语法格式 : <<<开始标识符 结束标识符

注意:

  • 定界符必须以 <<< 三个左尖括号开头
  • 开始标识符需要和结束标识符一样
  • <<<开始标识符后面不能有空格字符否则会解析错误

在对form表单的input标签赋值时,定界符赋值非常方便,还可以生成表单 nice

    $name = "张张";
    $pwd ="abc20001";

    $btn ="提交";
    $form1 = <<<form
    <form>
    用户名:<input type="text" value="$name" name="name"></br>
    密码:<input type="password" value="$pwd" name="name"></br>
    <input value="$btn" type="submit">
    </form>
    form;

    echo $form1;

输出:

<form>
用户名:<input type="text" value="张张" name="name"></br>
密码:<input type="password" value="abc20001" name="name"></br>
<input value="提交" type="submit">
</form>

字符串处理函数

1.字符串切片,修剪,转换函数

trim(),rtrim(),ltrim()

语法格式 :string trim(string str) ;函数功能 :trim去除字符串两边的空格。

    $str1 = "   你好呀!    ";
    $trim1 = trim($str1);
    echo $trim1."\n";// "你好呀!"

语法格式 :string ltrim(string str) ;函数功能 :ltrim去除字符串左边的空格。

    $str1 = "   你好呀!    ";
    $trim2 = ltrim($str1);
    echo $trim2."\n";// "你好呀!    "

语法格式 :string rtrim(string str) ;函数功能 :rtrim去除字符串右边的空格。

    $str1 = "   你好呀!    ";
    $trim3 = rtrim($str1);
    echo $trim3;//  "   你好呀!"

str_pad()

语法格式:string str_pad ( string str,int pad_length [,string pad_string [ ,int pad_type]])

功能:用填充字符串pad_str去填充str,并且将str的字符串长度填充到pad_length的长度,如果没有指定pad_str,则填充空格。

pad_tyoe,用来指定填充的模式,左边填充(STR_PAD_LEFT),右边填充(STR_PAD_RIGHT)和两侧填充(STR_PAD_BOTH),默认为右侧填充。(也可以用0,1,2来代替填充方式,如下面的php源码)。

    define('STR_PAD_LEFT', 0);
    define('STR_PAD_RIGHT', 1);
    define('STR_PAD_BOTH', 2);

填充示例:

    $src_str1 = "今天是2023/1/9";

    $dest_str = str_pad($src_str1,30," ",1);//默认右侧填充  "今天是2023/1/9             "
    echo $dest_str."\n";

    $dest_str = str_pad($src_str1,30," ",0);//两侧填充     "             今天是2023/1/9"
    echo $dest_str."\n";

    $dest_str = str_pad($src_str1,30," ",2);//左侧填充     "      今天是2023/1/9       "
    echo $dest_str."\n";

nl2br()

语法格式: string nl2br( string str)
函数功能: nl2br() 函数可以将字符串str中的换行符\n或\r转换为html中的换行符<br/>

tip:“我这里使用php7.4发现它\r不会转换为<br/>

    $cd_str = "你好啊小白\n,你准备干啥去\n,带上我呗~";
    $html_str = nl2br($cd_str);
    echo $html_str;
    /*
     * 输出:
     * 你好啊小白<br />
     * ,你准备干啥去<br />
     * ,带上我呗~
     */

strtoupper(),strtolower(),ucfirst(),ucwords()

字符串大小写转换函数,strtoupper()将字符串转换为大写,strtolower()将字符串转换为小写,ucfirst()将字符串的首字母大写,ucwords()将字符串中的每个单词的首字母大写。

    // 我这里是在控制台输出,所以每个echo都加了个换行,方便观察
    $str_old =  "kill a robin";

    $str_new1 = strtoupper($str_old);
    echo $str_new1."\n";// “KILL A ROBIN”

    $str_new2 = strtolower($str_old);
    echo $str_new2."\n";// “kill a robin”

    $str_new3 = ucfirst($str_old);
    echo $str_new3."\n";// “Kill a robin”

    $str_new4 = ucwords($str_old);
    echo $str_new4."\n";// “Kill A Robin”

addslashes() 和 stripslashes()

语法格式 :string addslashes( string str)
函数功能 : 在预定义字符前添加反斜线(\),预定义字符包括 单引号',双引号",反斜线\
应用场景:
假设我们需要一个表单获取用户搜索的关键字,而我们的php程序用来获取请求参数和拼接sql。

    $name = " 张'三";
    $sql1 = "select from student_info where sname = '$name'";
    echo  $sql1."\n";// select from student_info where sname = ' 张'三'

    // 这里因为name中的表单数据的用户输入失误,而导致的sql语句不正常拼接

    //为了解决这一问题,提高程序的健壮性 addslashes()函数,可以将用户输入的错误信息转换为正常的信息,将单引号转换为转义字符从而不影响sql的拼接

    $name =addslashes($name);
    $sql2 = "select from student_info where sname = '$name'";// select from student_info where sname = ' 张\'三'
    echo $sql2;

语法格式 :string stripslashes( string str)
函数功能 : stripslashes()函数用于删除字符串str中的反斜线。功能恰好与上面的addslashes()函数相反。

    $name ="张\三";
    echo stripslashes($name);// "张三"

htmlspecialchars() 和 strip_tags()

htmlspecialchars()函数用来将字符串中的特殊字符(<,&,",>)转换成为对应的php预定义字符实体。

预定义实体 对应的html,xml标签
&lt; <
&amp; &
&gt; >
&quot; "
&#039;

还有好多好多,这里只列举最常用的。

语法格式:string htmlspecialchars( string str,flags,character_set)
参数解析:flags和character_set都是可选参数
flags : 用来指定需要转换的双引号还是单引号,默认值为 ENT_COMPAT,表示转换双引号,不转换单引号。

  • ENT_COMPAT,默认值,表示转换双引号,不转换单引号。
  • ENT_QUOTES,默认值,表示转换双引号和单引号。
  • ENT_NOQUOTES,默认值,表示转换单引号,不转换双引号。

character_set: 用来指定字符串转换过程中的字符集,默认值为utf-8.
以下是可选字符集

  • UTF-8 :默认值
  • ISO-8859-1 :西欧
  • KOI8-R:俄语
  • GB2312:简体中文,国家标准字符集
  • BIG5:繁体中文,中国台湾地区使用
  • MacRoman: Mac操作系统使用的字符集
    $str1 = "<p>你好</p>";
    echo $str1."\n"; // <p>你好</p>

    $str1 = htmlspecialchars($str1);
    echo $str1; //&lt;p&gt;你好&lt;/p&gt;

strip_tags()函数用来将字符串中的html,xml,javascript,php的标签剔除掉。
语法格式:string strip_tags( string str)

    $str_1 ="<p>你好</p>";
    echo $str_1."\n";//<p>你好</p>
    // 使用strip_tags()函数将字符串中的标签去除,只留它的内容
    $str_1 = strip_tags($str_1);
    echo $str_1;// 你好

sprintf() 和 printf()

字符串格式化函数 sprintf()函数和printf()函数

语法格式:string sprintf(string format,arg1,arg2,arg3....,argn)
函数功能:返回字符串format格式化后的字符串。

语法格式:int printf(string format,arg1,arg2,arg3....,argn)
函数功能:将字符串参数format函数格式化后的字符串值打印到浏览器页面上,并且返回格式化后字符串的长度

format模板格式

转换格式 说明
% 打印%,不转换
b 转换成为二进制数
c 转换为对应的ascii码字符
d 转换成为对应的十进制数
e 科学计数法
o 转换八进制数
s 转换成字符串
u 转换为无符号十进制数
x 转换成小写十六进制数
X 转换成大写十六进制数
    $number1 = "49";
    echo $number1."\n";

    echo sprintf("%b",$number1)."\n";// 110001
    echo sprintf("%o",$number1)."\n";// 61
    echo sprintf("%x",$number1)."\n";// 31
    echo sprintf("%X",$number1)."\n";// 31
    echo sprintf("%c",$number1)."\n";// 1

    echo var_dump(sprintf("%s",$number1));//string(2) "49"
    $number1 = "49";
    echo $number1."\n";

    echo printf("%b",$number1)."\n";// 11000  16
    echo printf("%o",$number1)."\n";// 31  2
    echo printf("%x",$number1)."\n";// 31  2
    echo printf("%X",$number1)."\n";// 31  2
    echo printf("%c",$number1)."\n";// 1   1

    echo var_dump(printf("%s",$number1));// 49 int(2)

printf()和 sprintf()函数不同的就是,sprinft()会返回模板化后的字符串,而printf()会打印出模板后的字符串,并且返回其模板化后的长度。

2.字符串长度函数

strlen() 和 mb_strlen()

strlen()函数
语法格式:int strlen( string str)
函数功能: 返回字符串string的字节长度。

mb_strlen()函数
语法格式: int mb_strlen( string str [,string encoding])
函数功能:返回字符串string的字节长度,并且可以以指定的编码方式去解析字符串的长度。

tip:不同的文件编码,所占字节数不同。
例如:UTF-8编码。一个英文字符占一个字节长度,一个中文字符占三个字节长度。如果是GBK编码或者ANSI编码方式的话一个中文字符占2个字符。

    $content = "hello 小白";
    echo strlen($content)."\n";// 12   6+3x2=12

    $content2 = "hello 小白";
    echo mb_strlen($content2,"gbk");// 9

3.子串操作函数

3.1 取出指定位置的子串

substr()

语法格式: string substr( string str ,int start [,int length])
函数功能:返回字符串中索引位于strat和strat+length之间的字符串。如果没有指定length,则返回从start索引开始到字符串末尾的子字符串。

mb_substr()

语法格式: string mb_substr( string str ,int start [,int length [, string encoding] ])
函数功能:返回字符串中索引位于strat和strat+length之间的字符串。如果没有指定length,则返回从start索引开始到字符串末尾的子字符串。并且可以设置encoding编码方式解析字符串。

mb_struct()

语法格式: string mb_structr( string str ,int start [,int length [, string encoding] ])
函数功能:返回字符串中索引位于strat和strat+length之间的字符串。如果没有指定length,则返回从start索引开始到字符串末尾的子字符串。并且可以设置encoding编码方式解析字符串。将字符串中的每个字符按照一个字节去解析,当遇到中文(默认占两个字节)时,截取时多余的一个字节将舍去。

    $content1 = "hi,下午好~我是字符串";
    echo strlen($content1)."\n";// 28 4+8*3=28
    echo mb_strlen($content1,"gbk")."\n";
    echo substr($content1,0,8)."\n";// 因为子串字符截取长度不够,导致出现中文字符字节缺失而乱码 hi,下�
    echo substr($content1,0,9)."\n";// hi,下午
    echo mb_substr($content1,0)."\n";//hi,下午好~我是字符串

    echo mb_strcut($content1,0,6,"gb2312")."\n";// hi,下

3.2 在字符串中查找子串的位置

strpos()

语法格式:int strpos( string str ,string substr[,int offset])
函数功能:查找子串在主串中第一次出现的索引位置,如果主串不存在对应的子串,那么将返回false,offset用于指定从主串哪个位置开始找。

strrpos()

语法格式:int strrpos( string str ,string substr[,int offset])
函数功能:查找子串在主串中最后一次出现的索引位置,如果主串不存在对应的子串,那么将返回false,offset用于指定从主串哪个位置开始找。

mb_strpos()

语法格式:int mb_strpos( string str ,string substr[,int offset [,string encoding]])
函数功能:和strpos()基本一样,区别就是mb_strpos()可以设置encoding的编码方式去解析字符串。(找第一次出现的位置)

mb_strrpos()

语法格式:int mb_strrpos( string str ,string substr[,int offset [,string encoding]])
函数功能:和strrpos()基本一样,区别就是mb_strpos()可以设置encoding的编码方式去解析字符串。(找最后一次出现的位置)


    $content2 = "If we can avoid the violent ecstasy, there will be no grief ";

    $substr_1 = "w";
    $substr_2 = "W";
    echo strpos($content2,$substr_1)."\n";//3
    echo strrpos($content2,$substr_1)."\n";//43

    // 区分大小写字母,所以W不会找到
    echo strpos($content2,$substr_2)."\n";
    echo strrpos($content2,$substr_2)."\n";

3.3 取出字符串中指定子串的剩余字符串

strstr()

语法格式:string strstr( string str,string substr)
函数功能:取出从(区分大小写的)substr开始的剩余子串,如果没找到返回false.

stristr()

语法格式:string stristr( string str,string substr)
函数功能:取出从(不区分大小写的)substr开始的剩余子串,如果没找到返回false.

    $content2 = "If we can avoid the violent ecstasy, there will be no grief ";
    $substr_1 = "we";
    echo strstr($content2,$substr_1)."\n";// we can avoid the violent ecstasy, there will be no grief 
    $substr_2 = "We";
    echo strstr($content2,$substr_2)."\n";// 区分大小写所以没找到
    $substr_2 = "If";
    echo strstr($content2,$substr_2)."\n";// If we can avoid the violent ecstasy, there will be no grief

3.4 统计子串在字符串中出现的频率

substr_count()

语法格式: int substr_count(string str,string substr,int offset,int length)
函数功能:统计子串substr在主字符串str中出现的次数.

mb_substr_count()

语法格式:int mb_substr_count(string str,string substr,string encoding)
函数功能:统计子串substr在主字符串str中出现的次数,可以以encoding设置的编码方式去解析。

    $content3 = "And a list of all the repeated words.  ";
    $substr_1 = "a";
    echo substr_count($content3,$substr_1)."\n";

4.字符串比较函数

strcmp()

语法格式:int strcmp( string str1,string str2)
函数功能:以区分大小写的方式比较字符串str1和字符串str2.若两个字符串相等,则返回0,若str1大于str2则返回1,若str1小于str2则返回小于1的整数。

strcasecmp()

语法格式:string stristr( string str,string substr)
函数功能:以不区分大小写的方式比较字符串str1和字符串str2.若两个字符串相等,则返回0,若str1大于str2则返回1,若str1小于str2则返回小于1的整数。

    $password1 = "2020SOLO3517@12";
    $password2 = "2020sOLo3517@12";

    // strcmp区分大小写
    if(strcmp($password1,$password2)===0){
   
        echo "密码一致,正在登录中"."\n";
    }

    if((strcmp($password1,$password2)<0)){
   
        echo "密码不一致"."\n";
    }

    // strcasecmp 不区分大小写,所以登录成功

    if(strcasecmp($password1,$password2)===0){
   
        echo "密码一致,正在登录中"."\n";
    }

    if((strcasecmp($password1,$password2)<0)){
   
        echo "密码不一致"."\n";
    }

5.字符串连接和分割函数

implode()

语法格式:string implode( string glue,array arr)
函数功能:使用字符串glue将数组arr中的元素拼接成一个新的字符串。

    $arr_1 = array("橙子","西瓜","草莓","葡萄");
    $str_1 = implode("-",$arr_1);
    echo $str_1;// 橙子-西瓜-草莓-葡萄

strtok()

语法格式:string strtok(string str,string separator)
函数功能:使用分隔符对字符串str进行分割,若要进行连续分割则需要多次调用strtok()函数。

字符串分割遍历

    $str_2 = "白色,黑色,红色,绿色,蓝色";
    while ($str_2!==""){
   
        $temp_str =  strtok($str_2,",");//每次使用strtok()函数去分割子串
        echo $temp_str."\n";
        $temp_str_pos = strpos($str_2,$temp_str);//确定子串的起始位置
        $temp_str_size = strlen($temp_str);//确定子串的长度
        $str_2 = substr($str_2,$temp_str_pos+$temp_str_size);//将主串求子串,并且重新赋值
    }

6.字符串替换函数

str_replace()

语法格式:mixed str_replace( mixed search,mixed replacement,mixed str)
函数功能:以区分大小写的方式将字符串str中的字符串search片段替换为字符串replacement.

    // str_replace()区分大小写替换,所以Good不会被替换成为nice
    $str_1 = "Good morning, and in case I don't see you, good afternoon, good evening, and good night!";
    echo str_replace("good","nice",$str_1)."\n";//Good morning, and in case I don't see you, nice afternoon, nice evening, and nice night!

substr_replace()

语法格式:mixed substr_replace( string str,string substr,int start [, int length])
函数功能:将字符串str中的start位置开始到start+length位置结束的字符串由replacement替换,若没有指定length则从start开始替换到字符串str末尾.

    $str_2 = "Good morning!";
    $str_replace1 = "day";
    echo substr_replace($str_2,$str_replace1,7,3)."\n";// Good modayng!
    echo substr_replace($str_2,$str_replace1,7);// Good moday

strtr()

语法格式:string strtr (string str,array replacements)
函数功能:将字符串str中所有的字符串转换为数组replacements中键名相对应的值。(字符串中的子串去和数组的键名匹配)

    $replace_arr = array("<p>"=>"<div>","</p>"=>"</div>","<strong>"=>"<i>","</strong>"=>"</i>");
    $str = "<p><strong>hello</strong></p>";
    echo strtr($str,$replace_arr);//<div><i>hello</i></div>

7.其他常用的字符串函数

strrev()

语法格式:string strrev(string str)
函数功能:将英文字符串的顺序颠倒过来,并且返回一个新的字符串。中文字符使用这个函数会出现乱码

    $str_1 = "咔嚓";
    echo strrev($str_1)."\n";// 中文字符使用这个函数会出现乱码   ��唒�
    $str_2 = "hello world";
    echo strrev($str_2);//dlrow olleh

str_repeat()

语法格式:string str_repeat(string str, int times)
函数功能:重复字符串str指定的time次数。

    $say_hello = "hello\t";
    echo str_repeat($say_hello,10);// "hello    hello    hello    hello    hello    hello    hello    hello    hello    hello"

mb_convert_encoding()

语法格式:string mb_convert_encoding(string str,string to_encoding [,mixed from_encoding])
函数功能:将字符串从form_encoding的编码方式转换为to_encoding.

    $say_1 ="早上好,以防我见不着你,所以下午好,晚上好,晚安!";// 默认编辑器编码是utf-8,每个中文字符占三个字节
    echo strlen($say_1)."\n";// 73

    $say_1 = mb_convert_encoding($say_1,"gbk");//现在将其改为gbk编码,则每个中文字符占两个字节
    echo strlen($say_1)."\n";// 49

tip:因为php-web那块儿准备在后面的文章去写,所以字符串中的一些url处理函数,放到后面和请求响应一块儿写。

相关文章
|
10天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
6天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2506 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1519 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
8天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
530 13
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19282 30
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18836 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17524 13
Apache Paimon V0.9最新进展
|
8天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
457 48
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
353 4
叮咚!您有一份六大必做安全操作清单,请查收
|
2天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。