字符串和字符串的常用方法
PHP 之中单引号与双引号的使用
何时选择使用单引号或双引号?在 PHP 之中,单引号通常用来定义字符串,一般来说,使用单引号,变量不会被解析,转义字符也不会被解析,这是因为在单引号之中,字符或变量等通常会被认为是普通字符。
$str = "hello";
echo "$str world"; //结果: hello world
echo '$str world'; //结果: $str world
echo "hello /n world"; //结果: 会被转义;但是在浏览器之中不会显示,切换到命令控制台就会显示正常。
echo 'hello /n world'; //结果: hello /n world
由上述代码我们可以看到,双引号之中的变量可以被解析,但是如果变量之后还有一些混合字符串的话,PHP 会如何处理?
$str = "hello";
echo "$str's"; //此时正常输出,hello's
echo "$strs"; //我想要的结果是:hellos
//如何实现?
// 在PHP之中,如果在双引号之中有混合输出的话,变量必须使用{}包裹起来。
echo "{$str}s"; //结果:hellos
在 PHP 之中,如果在双引号之中有混合输出的话,变量必须使用{}包裹起来
可以看到,单引号内的内容不会被转义,因而针对于字符串时使用效率更高;
但是在 JS 之中,单双引号没有强制要求,只要搭配合理就行。
PHP 之中的可以使用反引号 ` 吗?
echo ``;
var_dump (``);
var_dump (`ggg`);
var_dump ("xxx`123`ggg");
var_dump ('xxx`123`ggg');
PHP 中,若字符串是以 反单引号包裹则返回 NULL ,若是在单引号或双引号中有反单引号则是普通字符串 。
字符串的定义方式
- 接上文,可以使用单引号定义字符串
内容会被认为是普通字符,大多数不会被解析,如变量,转义字符,表达式等
$str = 'hello world';
echo 'ggggggs545434';
- 双引号定义字符串
内容会被解析,如变量,表达式,转义字符等
$str = "hello";
echo "hello";
echo "$str";
定界符来定义一个字符串
定界符:
1.PHP 定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;2.在 PHP 定界符中的任何特殊字符都不需要转义;
3.PHP 定界符中的 PHP 变量会被正常的用其值来替换。作用:可以理解为是一个模板,类似于 JS 的``模板语法和 PHP 的模板语法。它的作用为:非常适合 html php 混编 :写模板
语法:以
<<<EOF
开始标记作为定界符定义字符串的开头,以EOF
来结束PS:
1.
<<<EOF
开始标记中的EOF
可以是用户自定义的,如>>>AAA
都是可以的,但是结尾一定要是以开始标记中的标记词XXX
来,如这里的标记语可以是AAA
结尾;2.结束标记
EOF
必须单独为一行,一定是要另起一行,并且改行除了Eof;
这个定界符结尾标识之外不能有任何其他字符,前后都不能有,包括空格。否则会提示报错:‘Parse error: parse error, unexpected $end in……’
语法演示:
// 变量可以被自动解析,并以其值来代替
$str = "hello";
$some = <<<EOF
$str world,<br>
this is eof,<br>
ggggggg。
EOF;
echo $some;
字符串操作
字符串的增改查
使用
{键值}
来实现
$str = "hello";
echo $str."<br>";
// 1. 查询
echo $str{3}."<br>";
// 2. 改变
$str{3}='g';
echo $str."<br>";
// 3. 增加
// 因为当前$str的键值只有0,1,2,3,4 所以我们想要增加,就给字符串增加第五个....键值
$str{5} = 's';
echo $str;
案例:随机生成一个四位数的验证码。
首先来了解下目前基础阶段我们想要随机生成一个数字的话需要用到的一个 PHP 内置的随机数函数:
mt_rand()
>mt_rand()
语法:mt_rand(起始范围,结束范围)
字符串长度的函数:strlen()
$str = 'QWERTYUIOPLKJHGFDSAZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890';
// 生成一个空变量,用来填充验证码
$code = '';
for($i=0;$i<4;$i++)
{
$code.= '<span style="color:rgb('.mt_rand(0,255).','.mt_rand(0,255).','.mt_rand(0,255).')">'.$str{mt_rand(0,strlen($str)-1)}.'</span>';
}
echo $code;
字符串打印输出函数
printf()
:将输出的字符串按指定格式输出
语法:printf(format,arg1,arg2…)
语法:printf(格式,字符 1,字符 2…)
printf 函数类似于python
之中的 format 操作字符串,也是通过使用占位符,后接,"字符串1","字符串2","字符串3"
来实现按指定格式格式化输出。
演示一下:
$str = "ggg";
$num = '99999';
printf("这篇博文是由{$str}来写的,字数共有:%s",$num);
占位符共有:
参数 | 描述 |
---|---|
format |
必需。规定字符串以及如何格式化其中的变量。 |
arg1 |
必需。规定插到 format 字符串中第一个 % 符号处的参数。 |
arg2 |
必需。规定插到 format 字符串中第二个 % 符号处的参数。 |
arg++ |
可选。规定插到 format 字符串中第三、四等等 % 符号处的参数。 |
format 中可能出现的占位符格式:
占位符 | 描述 |
---|---|
%% |
返回一个百分号 % |
%b |
二进制数 |
%c |
ASCII 值对应的字符 |
%d |
包含正负号的十进制数(负数、0、正数) |
%e |
使用小写的科学计数法(例如 1.2e+2) |
%E |
使用大写的科学计数法(例如 1.2E+2) |
%u |
不包含正负号的十进制数(大于等于 0) |
%f |
浮点数(本地设置) |
%F |
浮点数(非本地设置) |
%g |
较短的 %e 和 %f |
%G |
较短的 %E 和 %f |
%o |
八进制数 |
%s |
字符串 |
%x |
十六进制数(小写字母) |
%X |
十六进制数(大写字母) |
所有可能出现的占位符的演示:(来自 W3Cschool)
<?php
$num1 = 123456789;
$num2 = -123456789;
$char = 50; // The ASCII Character 50 is 2
// 注释:格式值 "%%" 返回百分号
printf("%%b = %b <br>",$num1); // Binary number
printf("%%c = %c <br>",$char); // The ASCII Character
printf("%%d = %d <br>",$num1); // Signed decimal number
printf("%%d = %d <br>",$num2); // Signed decimal number
printf("%%e = %e <br>",$num1); // Scientific notation (lowercase)
printf("%%E = %E <br>",$num1); // Scientific notation (uppercase)
printf("%%u = %u <br>",$num1); // Unsigned decimal number (positive)
printf("%%u = %u <br>",$num2); // Unsigned decimal number (negative)
printf("%%f = %f <br>",$num1); // Floating-point number (local settings aware)
printf("%%F = %F <br>",$num1); // Floating-point number (not local settings aware)
printf("%%g = %g <br>",$num1); // Shorter of %e and %f
printf("%%G = %G <br>",$num1); // Shorter of %E and %f
printf("%%o = %o <br>",$num1); // Octal number
printf("%%s = %s <br>",$num1); // String
printf("%%x = %x <br>",$num1); // Hexadecimal number (lowercase)
printf("%%X = %X <br>",$num1); // Hexadecimal number (uppercase)
printf("%%+d = %+d <br>",$num1); // Sign specifier (positive)
printf("%%+d = %+d <br>",$num2); // Sign specifier (negative)
?>
- 相关函数:
fprintf()
语法:fprintf(stream,format,arg1,arg2,arg++)
参数 | 描述 |
---|---|
stream |
必需。规定在何处写入/输出字符串。 |
format |
必需。规定字符串以及如何格式化其中的变量。 |
arg1 |
必需。规定插到 format 字符串中第一个 % 符号处的参数。 |
arg2 |
可选。规定插到 format 字符串中第二个 % 符号处的参数。 |
$str = "ggg";
$num = 99999;
printf("这篇博文是由{$str}来写的,字数共有:%s",$num);
$file = fopen("demo.txt","w"); //创建一个demo.txt文件,类型为写入
fprintf($file,"这篇文章的作者是%s,共有%d个字数。",$str,$num);
这里提及一下fopen()
函数。
作用:打开一个文件或 URL。
语法:fopen(filename,mode,include_path,context)
参数 | 描述 |
---|---|
filename |
必需。规定要打开的文件或 URL。 |
mode |
必需。规定您请求到该文件/流的访问类型。 |
include_path |
可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 ‘1’。 |
context |
可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。 |
mode 参数可能出现的具体值
参数 | 描述 |
---|---|
"r" |
只读方式打开,将文件指针指向文件头 |
"r+" |
读写方式打开,将文件指针指向文件头 |
"w" |
写入方式打开,清除文件内容,如果文件不存在则尝试创建之 |
"w+" |
读写方式打开,清除文件内容,如果文件不存在则尝试创建之 |
"a" |
写入方式打开,将文件指针指向文件末尾进行写入,如果文件不存在则尝试创建之 |
"a+" |
读写方式打开,通过将文件指针指向文件末尾进行写入来保存文件内容 |
"x" |
创建一个新的文件并以写入方式打开,如果文件已存在则返回 FALSE 和一个错误 |
"x+" |
创建一个新的文件并以读写方式打开,如果文件已存在则返回 FALSE 和一个错误 |
sprintf()
作用:把百分号(%)符号替换成一个作为参数进行传递的变量
类似于printf
,需要有一个格式化的输出样式,然后该函数将字符串按照格式输出
PS:sprintf()
==>只返回不输出
sprintf("这篇文章的作者是%s,字数共有:%d",'ggg',1245456);
页面上不会有任何显示,但是我们可以通过 echo 来输出。
3. vfprintf()
- vfprintf()
函数把格式化的字符串写到指定的输出流(例如:文件或数据库)。
PS:与 fprintf() 不同,vfprintf() 中的参数位于数组中。数组元素将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入第一个数组元素,在第二个 % 符号处,插入第二个数组元素,依此类推。
语法:vfprintf(stream,format,argarray)
$file = fopen("demo.txt","w");
vfprintf($file,"我的名字是%s,我今年有%d岁。",["GGG",19]);
最后会创建一个 demo.txt 并在其中写入:我的名字是GGG,我今年有19岁。
vprintf()
vprintf()
函数输出格式化的字符串。
printf("hello:%s,age:%d。","ggg",15);
echo "<br>";
vprintf("hello:%s,age:%d。",["ggg",15]);
PS:vprintf()
可以使用数组作为自己的参数,但是printf()
不行。
vsprintf()
vsprintf()
功能与sprintf()
相同,只是参数不同
PS:sprintf()
不能使用数组
作为参数,但是vsprintf()可以使用数组
作为自己的参数。
echo vsprintf("这篇文章的作者是%s,字数共有:%d",['ggg',1245456]);
字符串常用方法
explode()
explode() 函数把字符串打散为数组。
语法:explode("分隔符","字符串","返回或分割的数组的数量")
// 将一个字符串打散成为一个数组
$str = "hello world";
print_r(explode(" ",$str)); //输出 :Array ( [0] => hello [1] => world )
// 如果设置了分割的数组成员的数量,当设置的数量不够时,最后一个数组成员会包裹所有剩余的字符串
print_r(explode(",","1,2,3,4,5,6,7",3)); // 输出: Array ( [0] => 1 [1] => 2 [2] => 3,4,5,6,7 )
implode(),join()
implode(),join()
=>数组转字符串
语法:implode/join("连接符","数组");
echo implode(',',['html','css','vuejs','uniapp']);
echo "<br>";
echo join('-',['html','css','vuejs','uniapp']);
str_split()
将字符串转为数组,可以指定数组元素的宽度 byte
语法:str_split("字符串",宽度[可选])
$str = "ABCDEFGHIJKM888999";
// 没有指定宽度
echo "没有指定宽度"."<br>";
print_r (str_split($str));
echo "<br>";
// 指定宽度以后
echo "指定宽度以后"."<br>";
print_r(str_split($str,3));
substr()
作用:
substr()
函数返回【截取】字符串的一部分。
语法:substr(string,start,length)
参数:
参数 | 描述 |
---|---|
string |
想要截取的字符串 |
start |
字符串截取从何处开始截取 |
length |
截取的字符串长度,默认是一直到末尾 (不能为负数,因为是长度) |
PS:参数
start
从何处截取有三种情况:为正数的时候是从指定位置开始,为负数的时候是从结尾的指定位置
开始,-1
是最后一位字符串,为 0 时默认从字符串的第一个字符开始
$str = "ABCDEFGHIJKM888999";
// 从字符串的开头开始截取
echo "从字符串的开头开始截取(0)"."<br>";
echo substr($str,0,5);
echo "<br>";
echo "从字符串的指定位置开始截取(正数)"."<br>";
echo substr($str,2,5);
echo "<br>";
echo "从字符串的结尾的指定位置开始截取(负数)"."<br>";
echo substr($str,-2,3);
- ascii 函数
首先来了解下 ASCII 是什么:
等等
接下来 PHP 中对于 ASCII 函数的值和对于的解释的函数:ord()
=>得到指定字符的 ASCII 值chr()
=>将指定的 ASCII 值解释为指定字符
echo "Z的ASCII值是:"."<br>";
echo ord("Z");
echo "<br>";
echo "ASCII值为99的指定字符为:"."<br>";
echo chr(99);
- 比较字符串函数
这里说两个字符串比较函数,一个是大小写铭感的strcmp()
,一个是大小写不铭感的strcasecmp()
他们的参数都是:strcmp/strcasecmp(字符串,字符串)
说下它们的返回值:
$res = strcmp("aaa","AAA"); //1
echo $res;
$res = strcmp("AAA","AAA"); //0
echo "<br>";
echo $res;
$res = strcmp("AAA","aaa"); //-1
echo "<br>";
echo $res;
echo "<br>";
$res = strcasecmp("aaa","AAA"); //0
echo $res;
$res = strcasecmp("AAA","AAA"); //0
echo "<br>";
echo $res;
$res = strcasecmp("AAA","aaa"); //0
echo "<br>";
echo $res;
echo "<br>";
$res = strcasecmp("aaabbb","AAAA"); //1
echo $res;
echo "<br>";
$res = strcasecmp("AAAASSS","aaaasss"); //0
echo $res;
可以看到在strcasecmp()
中只要两边内容一致,哪怕大小写不一致都会返回 0
那这些返回值我们如何判定呢?
给大家提供一个表格:
返回值 | 描述 |
---|---|
0 |
两侧的字符串相等 |
1 |
字符串不相等,且左侧的字符串大于右侧的字符串 |
-1 |
字符串不相等,且左侧的字符串小于右侧的字符串 |
str_replace()
str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。
该函数必须遵循下列规则:
如果搜索的字符串是数组,那么它将返回数组。
如果搜索的字符串是数组,那么它将对数组中的每个元素进行查找和替换。
如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换
如果查找的是数组,而替换的是字符串,那么替代字符串将对所有查找到的值起作用。语法:
str_replace(find,replace,string,count)
参数 | 描述 |
---|---|
find |
必需。规定要查找的值。 |
replace |
必需。规定替换 find 中的值的值。 |
string |
必需。规定被搜索的字符串。 |
count |
可选。对替换数进行计数的变量。 |
返回值 | 返回带有替换值的字符串或数组。 |
$arr = ['支付宝转账','银行卡转账','微信转账','银行转账','钱包转账','余额转账','交友软件','婚恋软件'];
$str = "我们公司推荐大家使用支付宝转账或者银行卡转账或者微信转账来注册使用我们的交友婚恋软件";
$search = ['转账','公司','交友','婚恋'];
$place = ['---','***'];
// 原字符串和原数组:
echo "原字符串和原数组:"."<br>";
echo $str."<br>";
print_r($arr)."<br>";
echo "<hr>";
// 当被搜索的字符串的是一个字符串时:
echo "当被搜索的字符串的是一个字符串时:"."<br>";
echo str_replace($search,"****",$str);
echo "<hr>";
// 当被搜索的字符串是一个数组时:
echo "当被搜索的字符串是一个数组时:"."<br>";
print_r (str_replace($search,"****",$arr));
echo "<hr>";
// 当执行替换的元素少于查找到的元素时:
echo "当执行替换的元素少于查找到的元素时:剩余的元素会被空格替换"."<br>";
echo str_replace($search,$place,$str);
echo "<hr>";
// 如果查找的是一个数组,替换的是一个字符串。那字符串会对数组中的值起作用
echo "如果查找的是一个数组,替换的是一个字符串。那字符串会对数组中的值起作用"."<br>";
print_r(str_replace($search,"我被替换了",$arr));