7、PHP 8.4 新特性 - mbstring 扩展新增 mb_trim 等函数
mbstring
扩展为大多数 PHP 的标准字符串函数提供了多字节安全函数。但是,在 PHP 8.4 之前,mbstring
扩展没有为 ucfirst
和 lcfirst
函数提供多字节安全对应函数。
在 PHP 8.4 中,mbstring
扩展添加了 mb_ucfirst
和 mb_lcfirst
函数作为 ucfirst
和 lcfirst
函数的多字节安全替代方案。
在 PHP 8.4 中,mbstring
扩展引入了几个新的函数如下:
-
mb_trim()
-
mb_ltrim()
-
mb_rtrim()
-
mb_ucfirst()
-
mb_lcfirst()
mb_ucfirst 和 mb_lcfirst 函数
新的 mb_ucfirst
和 mb_lcfirst
函数提供了多字节安全的函数,用于将给定字符串的第一个字符转换为大写或小写。
与其余的 mb_*
函数类似,mb_ucfirst
和 mb_lcfirst
函数也接受 ?string $encoding = null
作为最后一个参数,这两个函数的第一个参数都是需要改变大小写的字符串。
需要注意的是,多字节的大小写转换可能会改变值的字节大小(
strlen()
输出)以及长度(mb_strlen()
输出)。例如:
- 开尔文符号的小写字母(K - U+212A,占用 3 字节)是 k(U+006B,占用 1 字节)。
- 德语中的eszett字符(ß)转换为大写时变为 SS,转换为标题格式时变为 Ss。在这种情况下,虽然字节大小仍然为 2 字节,但长度(
mb_strlen()
)从 1 变为 2。这可能会影响验证字符串长度和大小的功能,比如数据库索引的大小限制。
mb_ucfirst
mb_ucfirst
函数将给定字符串的第一个字符转换为标题首字母大写(即首字母大写),而字符串的其余部分保持不变,即使它原本是大写的。与 ucfirst
函数不同的是,mb_ucfirst
支持多字节字符,因此支持所有 Unicode 大小写转换规则。
mb_ucfirst 函数签名
/**
* 安全地将字符串的首个字符转换为多字节大写。
*
* @param string $string 要处理的字符串。
* @param string|null $encoding 可选参数,指定字符串的编码。如果未提供,将使用内部编码。
* @return string 返回转换后的字符串,其中首个字符被转换为大写,其余部分保持不变。
*/
function mb_ucfirst(string $string, ?string $encoding = null): string {}
mb_ucfirst 案例
<?php
declare(strict_types=1);
echo mb_ucfirst('test') . PHP_EOL; // Test - unchanged
echo mb_ucfirst('TEST') . PHP_EOL; // TEST
echo mb_ucfirst('tEst') . PHP_EOL; // TEst
echo mb_ucfirst('tEst') . PHP_EOL; // TEst
echo mb_ucfirst('łámał') . PHP_EOL; // Łámał
echo mb_ucfirst("\u{01CA}") . PHP_EOL; // "\u{01CB}"
echo mb_ucfirst("💓🙈") . PHP_EOL; // "💓🙈" - unchanged
echo mb_ucfirst("ß") . PHP_EOL; // "Ss" - Only the first S uppercase.
mb_lcfirst
类似于mb_ucfirst
函数,mb_lcfirst
函数将给定字符串的第一个字符更改为小写。与lcfirst
函数不同,mb_lcfirst
可以更改多字节字符。
mb_lcfirst 函数签名
/**
* 将给定字符串的第一个字符转换为小写(支持多字节字符)。
*
* @param string $string 要处理的字符串。
* @param string|null $encoding 可选参数,指定字符串的编码。如果未提供,则使用内部编码。
* @return string 返回转换后的字符串。
*/
function mb_lcfirst(string $string, ?string $encoding = null): string {}
mb_lcfirst 案例
<?php
declare(strict_types=1);
echo mb_lcfirst('test') . PHP_EOL; // test - unchanged
echo mb_lcfirst('TEST') . PHP_EOL; // tEST
echo mb_lcfirst('tEst') . PHP_EOL; // tEst
echo mb_lcfirst('tEst') . PHP_EOL; // tEst
echo mb_lcfirst('łámał') . PHP_EOL; // Łámał
echo mb_lcfirst("\u{01CA}") . PHP_EOL; // "\u{01CB}"
echo mb_lcfirst("💓🙈") . PHP_EOL; // "💓🙈" - unchanged
echo mb_lcfirst("ß") . PHP_EOL; // ß
mb_trim,mb_ltrim,mb_rtrim
mb_trim
mb_trim()
函数用于移除字符串开头和结尾的空白字符,支持多字节字符集,并且可以移除指定字符。
/**
* 从多字节字符串的开头和结尾修剪字符。
*
* @param string $string 需要修剪的原始字符串。
* @param string|null $characters 要修剪的字符列表。如果为 null,则修剪空白字符。
* @param string|null $encoding 字符串的编码。如果为 null,则使用内部编码。
* @return string 修剪后的字符串。
*/
function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string {}
mb_ltrim
mb_ltrim()
函数用于移除字符串开头的空白字符。它是 ltrim()
函数的多字节版本,支持 UTF-8 和其他多字节字符集。
/**
* 去除字符串开头的空白字符或其他指定字符(多字节安全)。
*
* @param string $string 要处理的输入字符串。
* @param string|null $characters 可选。如果指定,则从这个字符串的开头去除在 $characters 中指定的字符。
* 如果未指定,默认去除空白字符。
* @param string|null $encoding 可选。字符编码。如果未指定,则使用内部编码。
* @return string 返回处理后的字符串。
*/
function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string {}
mb_rtirm
mb_rtrim()
函数用于移除字符串结尾的空白字符。它是 rtrim()
函数的多字节版本,支持 UTF-8 和其他多字节字符集。
/**
* @param string $string
* @param string|null $characters
* @param string|null $encoding
* @return string
*/
function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string {}
案例
<?php
declare(strict_types=1);
$string = ' Hello, World! ';
echo mb_trim($string) . PHP_EOL; // Hello, World!
echo mb_ltrim($string) . PHP_EOL; // Hello, World!
echo mb_rtrim($string) . PHP_EOL; // Hello, World!