PHP基础-字符串(第16天)

字符串

一.有哪几种字符串,如何分类?

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,位置 处的字符0a,位置 处的字符2c,依此类推。

  • 如果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'); // 设置为土耳其语

不同语言的大小写规则可能不一样,比如:

  • 英语中:iI
  • 土耳其语中: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

    php 复制代码
    strpos("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 是一个 格式字符串,里面可以包含:

  1. 普通字符 → 会直接原样输出。
  2. 转换说明符(conversion specification) → 用 % 开头,用来格式化变量。

转换说明符的结构:

php 复制代码
%[argnum$][flags][width][.precision]specifier
  • argnum :指定第几个参数。比如 %2$d 表示用第二个参数作为整数输出。

    php 复制代码
    printf("%2$d, %1$d", 10, 20);//20, 10
    //%2$d → 第二个参数 → 20  %1$d → 第一个参数 → 10
    
    //2$ 
  • flags:控制对齐、前缀、填充方式。

  • width:字段宽度(最少占多少字符)。

  • precision:精度(小数点位数、字符串截断长度等)。

  • specifier:类型(整数、浮点数、字符串等)。

  1. Flags(标志)
标志 作用
- 左对齐(默认右对齐)
+ 正数前加 + 符号
(space) 正数前加空格
0 用 0 补齐数字(左填充)
'char' 用指定字符填充

示例:

php 复制代码
printf("%05d", 12); // 输出 00012
printf("%-5d", 12); // 输出 12   (右边补空格)
  1. Width(宽度)
  • 可以直接写整数,比如 %10d → 占 10 个字符宽。
  • 也可以用 * → 宽度由额外的参数提供:
php 复制代码
printf("%*d", 5, 12); // 输出 "   12",宽度 5
  1. 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 是要格式化的数字。

  1. 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
  1. 类型匹配规则
  • 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 原生的字符串函数(如 strlensubstrstr_shuffle)大多是基于 单字节编码(ASCII) 设计的。
  • 如果处理中文(多字节字符),要使用 mb_\* 系列函数 或用正则 /u(表示 UTF-8 模式)。
相关推荐
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082854 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe4 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
longxiangam4 天前
Composer 私有仓库搭建
php·composer
上海云盾-高防顾问4 天前
DNS异常怎么办?快速排查+解决指南
开发语言·php