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 模式)。
相关推荐
一念一花一世界3 小时前
Arbess从初级到进阶(7) - 使用Arbess+GitLab实现PHP项目自动化部署
ci/cd·gitlab·php·arbess
星光一影5 小时前
废品回收系统小程序源码
mysql·php·html5
曦樂~6 小时前
【Docker】网络
docker·容器·php
nvvas9 小时前
PHP安装ZSTD压缩库扩展
php
stand_forever11 小时前
PHP客户端调用由Go服务端GRPC接口
rpc·golang·php
TravisBytes16 小时前
一次 Qt 网络程序诡异崩溃排查:从 Breakpad 堆栈到 lambda 捕获悬空引用
网络·qt·php
Alex艾力的IT数字空间1 天前
完整事务性能瓶颈分析案例:支付系统事务雪崩优化
开发语言·数据结构·数据库·分布式·算法·中间件·php
q***76662 天前
网络安全防护指南:筑牢网络安全防线(510)
安全·web安全·php
denggun123452 天前
ios-WebP
macos·php·cocoa