PHP?trim函数对多字节字符的使用限制实例探究

 更新时间:2024年01月12日 08:58:14   作者:沈唁  
这篇文章主要为大家介绍了PHP?trim函数对多字节字符的使用限制实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

引言

先来判断下这段代码的输出是否一致?

$string = '沈唁 ';
var_dump(trim($string));
var_dump(preg_replace('/^[\s\0]+|[\s\0]+$/u', '', $string));

如果你觉得是一致的,那么就是大错特错了。

在日常工作中,经常需要处理字符串。其中一种常用的情况是,需要删除字符串两端的空白字符,这就是 trim() 函数原本的作用。

但是标准的 trim() 函数不能处理多字节字符。

什么是trim()函数?

在PHP中, trim() 函数用于删除字符串的开头和结尾的空白字符。默认情况下,这些字符包括:

  • "\0" - NULL
  • "\t" - 制表符
  • "\n" - 换行
  • "\v" - 垂直制表符
  • "\r" - 回车
  • " " - 空格

mbstring 扩展

在很多语言中,每个必要字符都能一对一映射到 8 bit 的值,但也有一些语言需要非常多的字符来书面通讯,以至于它们的编码范围不能仅仅包含在一个字节里。

开发多字节字符编码方案是为了在基于字节的常规编码系统中表达超过 256 个字符。

在使用trimsplitsplice 等等操作多字节编码的字符串的时候,特别需要注意,由于在这种编码方案下,两个或多个连续字节可能只表达了一个字符,所以需要使用专门的函数。 否则,你可能会得到一个以乱码的字符串结尾。

而 mbstring 提供了针对多字节字符串的函数,能够帮开发者处理 PHP 中的多字节编码。

mbstring 扩展的使用和普通字符串操作函数一致,而且仅仅需要加上mb_前缀即可。

类似于:

  • split => mb_split
  • strlen => mb_strlen
  • substr => mb_substr

以此类推,trim 是不是可以直接改为调用mb_trim

答案是也不是。因为你可能会得到一个错误:

PHP Fatal error:  Uncaught Error: Call to undefined function mb_trim()

mb_trimmb_ltrim 和 mb_rtrim

从 2022 年 8 月份就有人在 php-src 的 issue 进行了反馈,这三个函数也是前不久刚刚通过 RFC,合并到 PHP 内核中新增的。

https://github.com/php/php-src/commit/a80b6d7b99ae885cb450a563a788f57917cef74e

function mb_trim(string $string, string $characters = " \f\n\r\t\v\x00\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}"): string

function mb_ltrim(string $string, string $characters = " \f\n\r\t\v\x00\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}", ?string $encoding = null): string

function mb_rtrim(string $string, string $characters = " \f\n\r\t\v\x00\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}", ?string $encoding = null): string

所以虽然 8.3 刚发布,但是 8.3 中确实没有这三个函数,可能需要在 8.3.1 中才能使用了。

不过 PHP 足够灵活,使我们能够根据需要创建自定义的函数,如多字节 mb_trim() 函数。

if (!function_exists('mb_trim')) {
    function mb_trim($string)
    {
        return preg_replace('/^[\s\0]+|[\s\0]+$/u', '', $string);
    }
}

以上就是PHP trim函数对多字节字符的使用限制实例探究的详细内容,更多关于PHP trim限制多字节字符的资料请关注程序员之家其它相关文章!

相关文章

  • PHP面向对象程序设计之构造方法和析构方法详解

    PHP面向对象程序设计之构造方法和析构方法详解

    这篇文章主要介绍了PHP面向对象程序设计之构造方法和析构方法,结合具体实例形式详细分析了php面向对象程序设计中构造方法和析构方法的相关概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2019-06-06
  • PHP和Shell实现检查SAMBA与NFS Server是否存在

    PHP和Shell实现检查SAMBA与NFS Server是否存在

    这篇文章主要介绍了PHP和Shell实现检查SAMBA与NFS Server是否存在,本文分别给出了PHP检查脚本和Shell检查脚本,需要的朋友可以参考下
    2015-01-01
  • PHP从零开始打造自己的MVC框架之入口文件实现方法详解

    PHP从零开始打造自己的MVC框架之入口文件实现方法详解

    这篇文章主要介绍了PHP从零开始打造自己的MVC框架之入口文件实现方法,结合具体实例形式分析了php实现MVC框架入口文件的原理、定义及使用方法,需要的朋友可以参考下
    2019-06-06
  • 在wamp集成环境下升级php版本(实现方法)

    在wamp集成环境下升级php版本(实现方法)

    本篇文章是对在wamp集成环境下升级php版本的方法进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • 9个比较实用的php代码片段

    9个比较实用的php代码片段

    这篇文章主要介绍了9个非常有用的PHP代码片段,可以帮助你开发 PHP项目,下面这里收集了9个PHP代码片段,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • 调整优化您的LAMP应用程序的5种简单方法

    调整优化您的LAMP应用程序的5种简单方法

    Wikipedia、Facebook 和 Yahoo! 等主要 web 属性使用 LAMP 架构来为每天数百万的请求提供服务,而 Wordpress、Joomla、Drupal 和 SugarCRM 等 web 应用程序软件使用其架构来让组织轻松部署基于 web 的应用程序。
    2011-06-06
  • 利用PHP实现RPC的代码示例

    利用PHP实现RPC的代码示例

    RPC是一种计算机通信协议,用于使一个计算机程序可以调用另一个运行在不同计算机上的程序的过程或函数,并且无需了解底层网络细节,本文给大家详细介绍了如何利用PHP实现RPC,需要的朋友可以参考下
    2023-10-10
  • WordPress中编写自定义存储字段的相关PHP函数解析

    WordPress中编写自定义存储字段的相关PHP函数解析

    这篇文章主要介绍了WordPress中编写自定义字段的相关PHP函数解析,包括对不可见的自定义字段的相关介绍,需要的朋友可以参考下
    2015-12-12
  • php CI框架插入一条或多条sql记录示例

    php CI框架插入一条或多条sql记录示例

    本节主要为大家介绍了php CI框架如何插入一条或多条sql记录,示例代码如下,不了解的朋友不要错过
    2014-07-07
  • PHP实现的简单异常处理类示例

    PHP实现的简单异常处理类示例

    这篇文章主要介绍了PHP实现的简单异常处理类,结合具体实例形式分析了php基于面向对象技术实现异常处理操作的相关实现技巧,需要的朋友可以参考下
    2017-05-05

最新评论

?


http://www.vxiaotou.com