字符串
一.有哪几种字符串,如何分类?
1.1 字符串的 4 种 表示方式
-
单引号字符串
-
内容原样输出,不会解析变量或转移字符串(除了
\\和\') -
适合输出固定文本
php$name = 'Tom'; echo 'Hello $name'; // 输出 Hello $name echo 'I\'m Tom'; // 输出 I'm Tom -
-
双引号字符串
-
会解析变量和特殊转义字符串(如
\n,\t),识别不了\',但可以识别\" -
适合包含变量或转义符的字符串
php$name = "Tom"; echo "Hello $name"; // 输出 Hello Tom echo "Line1\nLine2"; // 换行输出 -
-
heredoc语法(常文本)
-
相当于没有单引号的单引号字符且可以结构化
-
写法:
<<<标识符...标识符- 是合法的标识符名(由字母、数字、下划线组成,不能以数字开头)
- 开头和结尾必须一致(区分大小写)
- 结束标识符必须独立一行,不能有缩进或空格
- 结束标识符后面必须紧跟分号
;
-
支持变量解析
-
结束标识符必须独立成行且无缩进
php$name = "Tom"; $str = <<<TEXT Hello, $name Welcome to PHP! TEXT; echo $str; -
-
Nowdoc 语法(不解析变量的长文本)
-
相当于没有双引号的双引号字符串 且可以结构化
-
写法与heredoc类似,但使用单型号包裹标识(开头标识)
-
适合输出包含大量
$或\的原样文本(例如 SQL 或正则)
php$name = "Tom"; $str = <<<'TEXT' Hello, $name Welcome to PHP! TEXT; echo $str; -
二.字符串的转义
2.1 转义的含义:
在计算机通用协议中,有一些特定的方式定义的字母,系统会特定处理,通常这种方式都是使用反斜杠+字母(单词)的特性
\r\n回车换行
php 在识别转移字符的时候也是用同样的模式:反斜杠+字母
在php中的系统常用的转义符号:
\':单引号字符串中显示单引号
\":双引号字符串中显示双引号
\r:表示回车
\n:代表新的一行
\t:类似tab键:输出4个空格
\$:在php中使$符号作为变量符号,因此需要特定识别
2.2 单引号和双引号的区别
1.其中单引号能够识别\',而双引号不能识别\'

2.双引号中因为能够识别$符号,所以双赢好可以解析变量,而单引号不能

-
双引号中变量的识别规则:
-
变量本身系统能够与后面的内容区分,应该保证变量的独立性,不要让系统难以区分
php$a = 'hello'; $str1 = 'abce $a dfg'; //单引号 不可以解析变量 $str2 = "abce $a dfg"; //双引号 可以解析变量 $str3 = "abce$adfg"; //难以区分Warning: Undefined variable $adfg i $str4 = "abce{$a}dfg"; //大括号可以解析变量 echo $str1, PHP_EOL, $str2, PHP_EOL, $str3, PHP_EOL, $str4, PHP_EOL; -
使用变量专业标识符(区分),给变量加上一组大括号{}
-
-
结构化定义字符串变量的规则:
-
结构化定义字符串对应的边界符有条件:
- 上便捷服后面不能跟任何内容 包括注释也不行
- 下边界符必须定格:最左边
- 下边界同样后面只能是分号,不能跟任何内容
-
结构化定义字符串的内部(边界符之间)的所有内容都是字符串本身
php$str = 'hello world'; $str1 = <<<abc //这是弹出的内容 <script> alert('$str'); //这里必须用单引号 </script> abc; echo $str1, PHP_EOL; //网页会弹出弹出框并显示hello word 显示'//这是弹出的内容'字符串本身
-
三.字符串的长度
3.1 基本函数strlen()
作用:得到字符串的长度(字节为单位)
示例
php
$a = 'hello world';
$str = strlen($a);
echo $str, PHP_EOL; //11
$b = '悠悠';
echo strlen($b), PHP_EOL; //6 一个中文字符在utf-8字符集中占三个字节
3.2 多字节字符串的长度问题
包含中文的长度
3.3 多字节字符串扩展模块
3.3.1 加载扩展
Mbstring 扩展(mb:multi bytes)
首先需要加载php的mbstring扩展
默认是注释状态

可以使用mb扩占带来很多函数
参考链接:https://www.php.net/manual/en/book.mbstring.php
3.3.2 mb_strlen函数
支持版本:
(PHP 4 >= 4.0.6、PHP 5、PHP 7、PHP 8)
作用:
mb_strlen ---获取字符串长度
语法
php
mb_strlen ( string $string , ? string $encoding =null ): int
参数
$string 正在检查字符串
encoding 字符串编码,如果省略或者为null(8.0支持为空),则使用内部字符串编码值
返回值
返回字符串中具有特定字符编码的字符数
示例
php
echo "<pre>";
$a = '悠悠';
echo $a . PHP_EOL;
echo mb_strlen($a) . PHP_EOL; //2
echo mb_strlen($a, 'utf-8') . PHP_EOL; //2
echo mb_strlen($a, 'GBK') . PHP_EOL; //3
echo mb_strlen($a, 'GB2312') . PHP_EOL; //4
echo mb_strlen($a, 'BIG5') . PHP_EOL; //4
echo mb_strlen($a, 'ASCII') . PHP_EOL; //6
echo mb_strlen($a, 'ISO-8859') . PHP_EOL; //6
echo strlen($a) . PHP_EOL; //6
echo "</pre>";
四.字符串相关函数
4.1 转换函数
4.1.1 implode (集中,内爆,塌缩)
作用
将数组中的元素按照某个规则链接成一个字符串(数组转字符串)
版本支持:php4-8
语法
php
implode ( string $separator , array $array ): string
参数
$separator 连接符
$array 数组
返回值
返回由连接符组成的字符串
示例
php
<?php
echo "<pre>";
$a = [1, 2, 3, 4, 5, 'yy'];
echo implode('-', $a) . PHP_EOL; //PHP End Of Line(行结束符) //1-2-3-4-5-yy
var_dump(implode(['a', 'b', 'c'])); // string(3) "abc" $separator 可不传
var_dump(implode('hello', [])); // string(0) "" 空数组会转换为空字符串
echo "</pre>";
4.1.2 explode(爆炸,分裂)
作用
将字符串的元素转换成一个数组,(字符串转换为数组)
语法
php
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
参数
$separator 分割符
不能为空字符串
php
var_dump(explode('', "123456")); //会报错Uncaught ValueError: explode(): Argument #1 ($separator) must not be empty
$string 要转化的字符串
$limit
-
如果设置了
limit参数并且是正数,则返回的数组包含最多limit个元素,而最后那个元素将包含string的剩余部分。 -
如果
limit参数是负数,则返回除了最后的 -limit个元素外的所有元素。 -
如果
limit是 0,则会被当做 1
返回值
此函数返回由字符串组成的 array,每个元素都是 string 的一个子串,它们被字符串 separator 作为边界点分割出来。
返回转换后的字符串以分隔符作为边界点分割的数组
示例
php
var_dump(explode("-", "1-2-3-4-5-yy"));
print_r(explode("-", "1-2-3-4-5-yy")) . PHP_EOL;
/*
array(6) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
string(1) "4"
[4]=>
string(1) "5"
[5]=>
string(2) "yy"
}
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => yy
)
*/
echo PHP_EOL; //PHP End Of Line(行结束符)
var_dump(explode("-", "1-2-3-4-5-yy", 3));
print_r(explode("-", "1-2-3-4-5-yy", 3)) . PHP_EOL;
/*
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(8) "3-4-5-yy"
}
Array
(
[0] => 1
[1] => 2
[2] => 3-4-5-yy
)
*/
4.1.3 str_split
split (分裂)
作用
字符串转换为数组,按照指定长度拆分字符串得到数组
语法
php
str_split(string $string, int $length = 1): array
参数
$string 字符串
$length 几个长度为一组 最小值为1
If length is less than 1, a ValueError will be thrown.
返回值
返回为字符串
示例
php
var_dump(str_split("123456", 2)); //按照2个字符截取字符串
print_r(str_split("123456", 2)) . PHP_EOL;
/*
array(3) {
[0]=>
string(2) "12"
[1]=>
string(2) "34"
[2]=>
string(2) "56"
}
Array
(
[0] => 12
[1] => 34
[2] => 56
)
*/
4.2 截取函数
4.2.1 trim
作用
本身默认用来去除字符串实例两边(头尾)的空格
语法
php
trim(string $string, string $characters = " \n\r\t\v\x00"): string
参数
$string 待处理的字符串
$characters 指定需要去除的字符串
如果不指定第二个参数将去除以下字符:(注意仍是去除头尾两端的)
" ": ASCII SP 字符0x20,一个普通的空格。"\t": ASCII HT 字符0x09,一个制表符。"\n": ASCII LF 字符0x0A,一个换行符。"\r": ASCII CR 字符0x0D,一个回车符。"\x00": ASCII NUL 字符0x00,一个 NUL 字节。"\v": ASCII VT 字符0x0B,一个垂直制表符。
第二个字符也可以指定字符范围例如
表示去掉字符串首尾所有大写英文字母 A 到 Z,
注意:范围是按 ASCII 编码顺序 定义的,不是字母顺序比如 'A..z' 包含的不仅是 A-Z,还包括 [ \ ] ^ _ 等中间符号
php
trim($string, 'A..Z')
.. 的意思就是:
"按 ASCII 编码顺序,从前一个字符到后一个字符的连续范围。"
其他常见用法
| 示例代码 | 解释 | 输出 |
|---|---|---|
trim("HelloWorld", "A..Z") |
去掉首尾的大写字母(H、W) | elloWorld |
trim("12345hello678", "0..9") |
去掉首尾的数字 | hello |
trim("~!!hello!!~", "!-~") |
去掉从 ! 到 ~ 的所有可打印字符 |
""(空字符串) |
trim(" abc ", " ") |
去掉空格 | abc |
示例
php
$str = "\tA1234\t5B ";
echo trim($str, 'A..Z') . PHP_EOL;
echo trim($str) . PHP_EOL;
结果如下:

4.2.2 ltrim
作用
删除字符串开头的空白字符(或其他字符)
语法
php
ltrim(string $string, string $characters = " \n\r\t\v\x00"): string
参数
$string 要处理的字符串
$characters
如果不传则默认值为" \n\r\t\v\x00",即处理以下开头出现的转义字符
" ": ASCII SP 字符0x20,一个普通的空格。"\t": ASCII HT 字符0x09,一个制表符。"\n": ASCII LF 字符0x0A,一个换行符。"\r": ASCII CR 字符0x0D,一个回车符。"\x00": ASCII NUL 字符0x00,一个 NUL 字节。"\v": ASCII VT 字符0x0B,一个垂直制表符。
返回值
返回处理后的字符串
示例
php
$str = "\x00\tA1234\t5B ";
var_dump(ltrim($str, 'A..Z'));
echo PHP_EOL;
var_dump(ltrim($str));
// 结果
/*
string(11) " A1234 5B "
string(9) "A1234 5B "
*/
4.2.3 rtrim
作用
删除结尾右侧的空表字符(或其他字符)
语法
php
ltrim(string $string, string $characters = " \n\r\t\v\x00"): string
参数
$string 要处理的字符串
$characters 要过滤的字符
默认值为" \n\r\t\v\x00"
如果不传默认处理:
" ": ASCII SP 字符0x20,一个普通的空格。"\t": ASCII HT 字符0x09,一个制表符。"\n": ASCII LF 字符0x0A,一个换行符。"\r": ASCII CR 字符0x0D,一个回车符。"\x00": ASCII NUL 字符0x00,一个 NUL 字节。"\v": ASCII VT 字符0x0B,一个垂直制表符。
示例
php
$str = "\x00\tA1234\t5B\n ";
var_dump(rtrim($str, 'A..Z'));
echo PHP_EOL;
var_dump(rtrim($str));
// 结果
/*
string(13) " A1234 5B
"
string(10) " A1234 5B"
*/
4.2.4 substr
作用
是一个字符串截取函数,用来从原字符串中取出一部分内容
语法
php
substr ( string $string , int $offset , ? int $length =null ): string
参数
$string 要处理的原字符串
$offset 起始位置
-
如果
offset为非负数,则返回的字符串将从offset的第 个位置 开始string,从零开始计数。例如,在字符串 中abcdef,位置 处的字符0是a,位置 处的字符2是c,依此类推。 -
如果
offset为负数,则返回的字符串将从offset倒数第二个字符开始string。 -
如果长度
string小于指定offset字符数,则返回空字符串。
$length 要截取的长度(可以是正数、负数或省略)
-
如果
length给定且为正数,则返回的字符串最多包含length从开头的个字符offset(取决于的长度string)。 -
如果
length给定一个值且该值为负数,则会从字符串末尾省略相应数量的字符string。也就是说,它不是"从后往前取",而是"从前往后取,但不取最后几个字符 "。如果该offset值表示截断位置或其后的位置,则会返回一个空字符串。substr("abcdef", 0, -2); // 结果:abcd-
解释:
-
从位置
0开始(也就是开头) -
要取的长度是
-2 -
意思是"取到倒数第 2 个字符之前"
→ 所以结果是
"abcd"
-
-
-
如果
length给定且为空0,则返回空字符串。 -
如果
length省略或,则返回 **null**从开始到字符串末尾的子字符串 。offset
返回值
返回截取的部分或空字符串
示例
4.2.5 strstr
作用
查找字符首次出现
语法
php
strstr(string $haystack, string $needle, bool $before_needle = false): string|false
参数
$hasystack 原字符串
$needle 针 需要查找的字符
$before_needle
- true 返回第一个出现针之前的部分 (不包括针本身)
- 默认false 返回第一个出现针之后的部分(包括针本身)
返回值
返回字符串的一部分 如果找不到针返回false
示例
php
echo strstr('aba', 'a') . PHP_EOL; //aba
echo strstr('窈窕淑女,君子好逑', '女') . PHP_EOL; //女,君子好逑
4.3 大小写转换函数
4.3.1 strtolower
作用
将字符串转换为小写
语法
php
strtolower(string $string): string
参数
$string 要处理的字符串
返回值
返回转换后的小写字符串
示例
php
$str = 'AbcDeF';
var_dump(strtolower($str)); //string(6) "abcdef"
4.3.2 strtoupper
作用
将字符串转换为大写
语法
php
strtolower(string $string): string
参数
$string 要处理的字符串
返回值
返回转换后的大写字符串
示例
php
$str = 'AbcDeF';
var_dump(strtoupper($str)); // string(6) "ABCDEF"
4.3.3 ucfirst
作用
将字符串的首字母转换为大写
u pper c ase first
- upper大写
- case 字母大小写
- 在编程和语言学中,case 表示「字母的大小写」
- first 第一个
第一个字母大小写为大写
语法
php
ucfirst(string $string): string
参数
$string 要处理的字符串
返回值
返回转换后的大写字符串
注意 8.2以前按照时区的不同转换效果不同
8.2以后 大小写转换不再依赖于使用 setlocale() 设置的区域设置。只会转换 ASCII 字符。
setlocale() 是什么?
在 PHP 里,setlocale() 用来设置"区域设置"(locale),比如语言、国家、字符集等。
例如:
setlocale(LC_CTYPE, 'tr_TR.UTF-8'); // 设置为土耳其语
不同语言的大小写规则可能不一样,比如:
- 英语中:
i→I - 土耳其语中:
i→İ(注意上面多了一个点!)
PHP 8.2 起,大小写转换固定按 ASCII 规则,不会因为语言不同而变化
要是你在国际化项目里需要支持多语言(比如土耳其语、德语的特殊大小写),就要改用:
php
mb_convert_case($str, MB_CASE_TITLE, 'UTF-8');
示例
php
$str = 'abcDeF';
var_dump(ucfirst($str)); //string(6) "AbcDeF"
4.4 查找函数
4.4.1 strpos
作用
查找字符串中子字符串首次出现的位置
pos-postion-位置
语法
php
strpos(string $haystack, string $needle, int $offset = 0): int|false
参数
你要在一堆干草 (haystack) 里找一根针 (needle)
$haystack 被搜索的字符串
$needle 要找的内容
-
7.2以前
needle写成了数字,在 PHP 7.2 及更早版本里,PHP 会自动把整数97转换成它对应的 ASCII 字符'a',因为字符'a'的 ASCII 码就是97 -
7.2以后废弃这个行为,可以使用chr
phpstrpos("abc", "97"); // 找字符串 "97" strpos("abc", chr(97)); // 找字符 'a'
$offset
-
如果指定偏移量,搜索将从字符串开头开始,计算指定数量的字符。
-
如果偏移量为负数,搜索将从字符串末尾开始,计算指定数量的字符
返回值
haystack返回针相对于字符串起始位置的坐标(与offset 无关)。
- 另请注意,字符串位置从 开始
0,而不是从 开始1。
如果未找到针头, 则返回**false**。
示例
php
$search = "abc1abc";
echo strpos($search, "1", -4); //3
echo strpos($search, "d", -4); //''空字符串因为false隐式转换为空
var_dump(strpos($search, "d")); //bool(false)
4.4.2 strrpos
作用
查找字符串中子字符串最后一次(右边)出现的位置
语法
php
strrpos ( string $haystack , string $needle , int $offset =0 ): int | false
参数
$haystack 被搜索的字符串
$needle 搜索关键针
offset 偏移量
返回值
- 如果找到了返回对应下标
- 从0开始
- 如果没找到返回false
示例
php
$search = "abc1a1bc";
echo strrpos($search, "1") . PHP_EOL; //5
echo strrpos($search, "1", -4) . PHP_EOL; //3
echo strrpos($search, "d", -4) . PHP_EOL; // 空字符串因为false隐式转换为空
var_dump(strrpos($search, "d")); //bool(false)
4.5 替换函数
4.5.1 str_replace
作用
将搜索字符串的所有出现位置替换为替换字符串
语法
php
str_replace(
array|string $search,
array|string $replace,
string|array $subject,
int &$count = null
): string|array
参数
$search 当前搜索的字符串,针
$replace 替换的值
$subject 要搜索和替换的字符串或数组,干草堆,原数组或原字符串
count 如果通过,则此值将设置为执行的替换次数。
返回值
返回一个包含替换值的字符串或数组
示例
php
$bodytag = str_replace("%body%", "black", "abc%body%");
echo $bodytag, PHP_EOL; //abcblack
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");
echo $onlyconsonants . PHP_EOL; //Hll Wrld f PHP
$phrase = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy = array("pizza", "beer", "ice cream");
$newphrase = str_replace($healthy, $yummy, $phrase);
echo $newphrase, PHP_EOL; //You should eat pizza, beer, and ice cream every day
$str = str_replace("ll", "", "good golly miss molly!", $count);
echo $count, PHP_EOL;//成功匹配两次 2
4.6 格式化函数
4.6.1 printf
作用
输出格式化字符串
语法
php
printf(string $format, mixed ...$values): int
参数
$format
format 是一个 格式字符串,里面可以包含:
- 普通字符 → 会直接原样输出。
- 转换说明符(conversion specification) → 用
%开头,用来格式化变量。
转换说明符的结构:
php
%[argnum$][flags][width][.precision]specifier
-
argnum :指定第几个参数。比如
%2$d表示用第二个参数作为整数输出。phpprintf("%2$d, %1$d", 10, 20);//20, 10 //%2$d → 第二个参数 → 20 %1$d → 第一个参数 → 10 //2$ -
flags:控制对齐、前缀、填充方式。
-
width:字段宽度(最少占多少字符)。
-
precision:精度(小数点位数、字符串截断长度等)。
-
specifier:类型(整数、浮点数、字符串等)。
- Flags(标志)
| 标志 | 作用 |
|---|---|
- |
左对齐(默认右对齐) |
+ |
正数前加 + 符号 |
(space) |
正数前加空格 |
0 |
用 0 补齐数字(左填充) |
'char' |
用指定字符填充 |
示例:
php
printf("%05d", 12); // 输出 00012
printf("%-5d", 12); // 输出 12 (右边补空格)
- Width(宽度)
- 可以直接写整数,比如
%10d→ 占 10 个字符宽。 - 也可以用
*→ 宽度由额外的参数提供:
php
printf("%*d", 5, 12); // 输出 " 12",宽度 5
- Precision(精度)
- 浮点数:小数点后的位数 f
php
printf("%.2f", 3.14159); // 输出 3.14
- 字符串:截断字符串长度 s
php
printf("%.3s", "Hello"); // 输出 "Hel"
-
特殊 :
*表示精度也由参数提供。
php
width = 8;
$precision = 3;
$num = 12.34567;
printf("%*.*f\n", $width, $precision, $num);// 12.346
-
%f表示输出浮点数; -
第一个
*代表「字段宽度」(这里是 8 个字符宽); -
第二个
*代表「小数精度」(这里是保留 3 位小数); -
这两个值依次由
$width和$precision提供; -
$num是要格式化的数字。
- Specifier(类型说明符)
| 类型 | 描述 |
|---|---|
% |
输出 % |
b |
二进制 |
c |
ASCII 字符 |
d |
带符号整数 |
u |
无符号整数 |
o |
八进制 |
x |
十六进制(小写) |
X |
十六进制(大写) |
f, F |
浮点数 |
e, E |
科学计数法 |
g, G, h, H |
综合格式(自动选择 f 或 e) |
s |
字符串 |
示例:
php
printf("%d", 42); // 输出 42
printf("%08X", 255); // 输出 000000FF
printf("%s", "abc"); // 输出 abc
- 类型匹配规则
- PHP 会尽量把变量转换成对应类型:
- 字符串 →
%s - 整数 →
%d, %u, %c, %o, %x, %X, %b - 浮点数 →
%e, %E, %f, %F, %g, %G, %h, %H
- 字符串 →
$value 需要格式化的值 可以是多个参数
返回值
返回输出字符串的长度。
-
从 PHP 8.0.0 开始,如果参数个数为零,则会抛出ValueError 异常
E_WARNING。在 PHP 8.0.0 之前的版本中,则会发出其他异常。 -
从 PHP 8.0.0 开始,如果width值小于零或大于某个阈值,则会抛出ValueError异常。在 PHP 8.0.0 之前的版本中,则会发出一个错误信息。
[width]PHP_INT_MAX****E_WARNING -
从 PHP 8.0.0 开始,如果precision值小于零或大于某个阈值,则会抛出ValueError异常。在 PHP 8.0.0 之前的版本中,则会发出一个错误信息。
[precision]PHP_INT_MAX****E_WARNING -
从 PHP 8.0.0 开始,当提供的参数少于所需数量时,会抛出ArgumentCountError**
false异常。在 PHP 8.0.0 之前,则会返回 null 并E_WARNING**发出一个异常。
示例
php
$n = 43951789;
$c = 65; // ASCII 65 is 'A'
printf("%%b = '%b'\n", $n); //%%是输出% b=也是正常字符输出 后面是匹配字符%b表示输出2进制字符 所以是%b = '10100111101010011010101101'
echo PHP_EOL;
printf("%03d", 1); //用0填充到3位字符所以是001
echo PHP_EOL;
printf("% 6d", 1); //用空格填充到6位字符 所以是 1
echo PHP_EOL;
printf("%'26d", 1); //'char形式 用2填充到6位字符所以是222221
echo PHP_EOL;
printf("%%c = '%c'\n", $c); //%c是匹配ASCII 输出格式 所以是 %c = 'A'
printf("%%d = '%d'\n", $n); //输出整数所以是 %d = '43951789'
printf("%%e = '%e'\n", $n); //以科学计数法输出 所以是 %e = '4.395179e+7'
$e = 1000;
printf("%%e = '%e'\n", $e); //以科学计数法输出 所以是 %e = '1.000000e+3'
$u = -43951789;
printf("%%u = '%u'\n", $u); //无符号整数输出 按照补码转换也就是2^64 - 43951789 = 18446744073665599827 %u = '18446744073665599827'
printf("%%f = '%f'\n", $n); //浮点数输出%f = '43951789.000000' 默认六位
printf("%%f = '%.2f'\n", $n); //浮点数输出保留两位 %f = '43951789.00'
printf("%%o = '%o'\n", 10); //八进制输出 %o = '12'
printf("%%x = '%x'\n", 31); //16进制输出 %x = '1f' 小写
printf("%%X = '%X'\n", 31); //16进制输出%X = '1F' 大写
printf("%%+d = '%+d'\n", $n); //正整数输出 如果是正数前会加 `+` 符号 所以结果为%+d = '+43951789'
$u = -43951789;
printf("%%+d = '%+d'\n", $u); //负整数输出 因为不是正数则不加+ 所以%+d = '-43951789'
4.6.2 sprintf
作用
返回一个格式化后的字符串
注意:和printf的区别就是
-
printf直接 输出 格式化后的字符串到屏幕(标准输出) -
sprintf:只是 返回 格式化后的字符串,不会直接输出。
php
$name = "yy";
$age = 25;
// printf 直接输出
printf("我的名字是 %s,我今年 %d 岁。\n", $name, $age);
// sprintf 返回字符串
$str = sprintf("我的名字是 %s,我今年 %d 岁。\n", $name, $age);
echo $str;
语法
php
sprintf(string $format, mixed ...$values): string
参数
$format
%[argnum$][flags][width][.precision]specifier
argnum$ 控制第几个参数
flags 一些填充标志
| 标志 | 作用 |
|---|---|
- |
左对齐(默认右对齐) |
+ |
正数前加 + 符号 |
(space) |
正数前加空格 |
0 |
用 0 补齐数字(左填充) |
'char' |
用指定字符填充 |
width 宽度 返回的字符串长度
.precision (精度)
- 浮点数:小数点后的位数 f
php
printf("%.2f", 3.14159); // 输出 3.14
- 字符串:截断字符串长度 s
php
printf("%.3s", "Hello"); // 输出 "Hel"
- 特殊 :
*表示精度也由参数提供。
php
$width = 8;
$precision = 3;
$num = 12.34567;
echo sprintf("%*.*f\n", $width, $precision, $num); // 12.346
-
%f表示输出浮点数; -
第一个
*代表「字段宽度」(这里是 8 个字符宽); -
第二个
*代表「小数精度」(这里是保留 3 位小数); -
这两个值依次由
$width和$precision提供; -
$num是要格式化的数字。
返回值
返回格式化后的字符串
示例与printf相似
php
$num = 5;
$location = 'tree';
$format = 'There are %d monkeys in the %s';
echo sprintf($format, $num, $location);
4.7 其他函数
4.7.1 str_repeat
作用
重复一个字符串
语法
php
str_repeat(string $string, int $times): string
参数
$string 要重复的字符串
$times 重复次数
返回值
返回重复后的字符串
示例
php
echo str_repeat('yy', 8) . PHP_EOL; //yyyyyyyyyyyyyyyy
4.7.2 str_shuffle
作用
shuffle-洗(牌)
随机打乱字符串
注意:是按字节来打乱字符串的,而不是按"字符"打乱
语法
php
str_shuffle(string $string): string
参数
$string 需要打乱的字符串
返回值
打乱后的字符串
示例
php
echo str_shuffle('我是一个粉刷匠,粉刷本领强') . PHP_EOL;//���振��嬲���匈帼��淲���䀢�瘉�
//因为中文是三个字节 打乱后会乱码
echo str_shuffle('abcdefg') . PHP_EOL; //edcbafg
延伸
- PHP 原生的字符串函数(如
strlen、substr、str_shuffle)大多是基于 单字节编码(ASCII) 设计的。 - 如果处理中文(多字节字符),要使用
mb_\*系列函数 或用正则/u(表示 UTF-8 模式)。
