7、PHP 8.4 新特性 - mbstring 扩展新增 mb_trim 等函数

作者: 温新

图书: 【PHP 8.4 新特性】

阅读: 202

时间: 2025-01-18 07:41:23

mbstring 扩展为大多数 PHP 的标准字符串函数提供了多字节安全函数。但是,在 PHP 8.4 之前,mbstring 扩展没有为 ucfirstlcfirst 函数提供多字节安全对应函数。

在 PHP 8.4 中,mbstring 扩展添加了 mb_ucfirstmb_lcfirst 函数作为 ucfirstlcfirst 函数的多字节安全替代方案。

PHP 8.4 中,mbstring 扩展引入了几个新的函数如下:

  • mb_trim()
  • mb_ltrim()
  • mb_rtrim()
  • mb_ucfirst()
  • mb_lcfirst()

mb_ucfirst 和 mb_lcfirst 函数

新的 mb_ucfirstmb_lcfirst 函数提供了多字节安全的函数,用于将给定字符串的第一个字符转换为大写或小写。

与其余的 mb_* 函数类似,mb_ucfirstmb_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!
请登录后再评论