PHP?trim函數(shù)對(duì)多字節(jié)字符的使用限制實(shí)例探究
引言
先來(lái)判斷下這段代碼的輸出是否一致?
$string = '沈唁 '; var_dump(trim($string)); var_dump(preg_replace('/^[\s\0]+|[\s\0]+$/u', '', $string));
如果你覺(jué)得是一致的,那么就是大錯(cuò)特錯(cuò)了。
在日常工作中,經(jīng)常需要處理字符串。其中一種常用的情況是,需要?jiǎng)h除字符串兩端的空白字符,這就是 trim()
函數(shù)原本的作用。
但是標(biāo)準(zhǔn)的 trim()
函數(shù)不能處理多字節(jié)字符。
什么是trim()函數(shù)?
在PHP中, trim()
函數(shù)用于刪除字符串的開(kāi)頭和結(jié)尾的空白字符。默認(rèn)情況下,這些字符包括:
"\0"
- NULL"\t"
- 制表符"\n"
- 換行"\v"
- 垂直制表符"\r"
- 回車(chē)" "
- 空格
mbstring 擴(kuò)展
在很多語(yǔ)言中,每個(gè)必要字符都能一對(duì)一映射到 8 bit
的值,但也有一些語(yǔ)言需要非常多的字符來(lái)書(shū)面通訊,以至于它們的編碼范圍不能僅僅包含在一個(gè)字節(jié)里。
開(kāi)發(fā)多字節(jié)字符編碼方案是為了在基于字節(jié)的常規(guī)編碼系統(tǒng)中表達(dá)超過(guò) 256 個(gè)字符。
在使用trim
、split
、splice
等等操作多字節(jié)編碼的字符串的時(shí)候,特別需要注意,由于在這種編碼方案下,兩個(gè)或多個(gè)連續(xù)字節(jié)可能只表達(dá)了一個(gè)字符,所以需要使用專(zhuān)門(mén)的函數(shù)。 否則,你可能會(huì)得到一個(gè)以亂碼的字符串結(jié)尾。
而 mbstring
提供了針對(duì)多字節(jié)字符串的函數(shù),能夠幫開(kāi)發(fā)者處理 PHP 中的多字節(jié)編碼。
mbstring
擴(kuò)展的使用和普通字符串操作函數(shù)一致,而且僅僅需要加上mb_
前綴即可。
類(lèi)似于:
split
=>mb_split
strlen
=>mb_strlen
substr
=>mb_substr
以此類(lèi)推,trim
是不是可以直接改為調(diào)用mb_trim
?
答案是也不是。因?yàn)槟憧赡軙?huì)得到一個(gè)錯(cuò)誤:
PHP Fatal error: Uncaught Error: Call to undefined function mb_trim()
mb_trim
、mb_ltrim
和 mb_rtrim
從 2022 年 8 月份就有人在 php-src 的 issue 進(jìn)行了反饋,這三個(gè)函數(shù)也是前不久剛剛通過(guò) RFC,合并到 PHP 內(nèi)核中新增的。
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 剛發(fā)布,但是 8.3 中確實(shí)沒(méi)有這三個(gè)函數(shù),可能需要在 8.3.1 中才能使用了。
不過(guò) PHP 足夠靈活,使我們能夠根據(jù)需要?jiǎng)?chuàng)建自定義的函數(shù),如多字節(jié) mb_trim()
函數(shù)。
if (!function_exists('mb_trim')) { function mb_trim($string) { return preg_replace('/^[\s\0]+|[\s\0]+$/u', '', $string); } }
以上就是PHP trim函數(shù)對(duì)多字節(jié)字符的使用限制實(shí)例探究的詳細(xì)內(nèi)容,更多關(guān)于PHP trim限制多字節(jié)字符的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP基于GD庫(kù)實(shí)現(xiàn)的生成圖片縮略圖函數(shù)示例
這篇文章主要介紹了PHP基于GD庫(kù)實(shí)現(xiàn)的生成圖片縮略圖函數(shù),涉及php針對(duì)圖片屬性相關(guān)操作技巧,需要的朋友可以參考下2017-07-07php判斷某個(gè)方法是否存在函數(shù)function_exists (),method_exists()與is_callabl
這篇文章主要介紹了php判斷某個(gè)方法是否存在函數(shù)function_exists (),method_exists()與is_callable()區(qū)別與用法,結(jié)合實(shí)例形式分析了php function_exists (),method_exists()與is_callable()基本功能、用法、區(qū)別與操作注意事項(xiàng),需要的朋友可以參考下2020-04-04Optimizer與Debugger兼容性問(wèn)題的解決方法
網(wǎng)上許多聲音說(shuō)Optimizer與Debugger有沖突,不能同時(shí)開(kāi)。其實(shí)是可以的,他們兩個(gè)都是Zend擴(kuò)展插件,兩個(gè)單獨(dú)安裝都可以使用,但是要同時(shí)安裝的話必須使用一個(gè)管理器2008-12-12php魔術(shù)方法與魔術(shù)變量、內(nèi)置方法與內(nèi)置變量的深入分析
本篇文章是對(duì)php魔術(shù)方法與魔術(shù)變量、內(nèi)置方法與內(nèi)置變量進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP如何實(shí)現(xiàn)Unicode和Utf-8編碼相互轉(zhuǎn)換
本文介紹了通過(guò)PHP實(shí)現(xiàn)一個(gè)函數(shù)可以對(duì)字符串進(jìn)行Unicode的編碼和解碼,需要的朋友可以參考下2015-07-07PHP中unset,array_splice刪除數(shù)組中元素的區(qū)別
php中刪除數(shù)組元素是非常的簡(jiǎn)單的,但有時(shí)刪除數(shù)組需要對(duì)索引進(jìn)行一些排序要求我們會(huì)使用到相關(guān)的函數(shù),這里我們來(lái)介紹使用unset,array_splice刪除數(shù)組中的元素區(qū)別吧2014-07-07