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标签 |
---|---|
< |
< |
& |
& |
> |
> |
" |
" |
' |
’ |
还有好多好多,这里只列举最常用的。
语法格式: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; //<p>你好</p>
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处理函数,放到后面和请求响应一块儿写。