這篇文章帶給大家的內容是關於php trim函數的詳細解析,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
字串的處理在任何程式中應該是最常見的了吧。 php 的trim函數就是用來去除字串的字串。最常用的就是去除空格了。但是,這個簡單的函數,是否真的像你所想的那麼簡單呢?
trim函數的定義如下:
trim是兩邊去除,還有ltrim 從左邊去除,rtrim從右邊去除,在php源碼中,最終都是透過一個函數處理的。所以一下關於trim是對php 內部統一的trim而言。
原始碼在ext/standard/string.c中php_trim函數中。
trim函數處理邏輯:
1、判斷是否設定去除內容what,沒設定則移除預設字串
2、判斷移除內容的長度,分成1個字符,多個字符去除
3、使用model分別與1,2按位與運算,確定是否進行左右去除
去除一個字符的情況:
對於左邊去除,遍歷字串的每個字符,把第一個與what不相等的字符的位置作為新字符串的起始位置,同時更新長度
對右邊去除,從右邊開始遍歷,找出第一個不等於what的字符,把字串長度減去遍歷次數。
到這裡,新字串起始位置有了,長度也確定了,然後執行字串賦複製指令,返回移除之後的字串
去除多個字串的情況:
首先使用一個mask數據,用於標記那些需要移除的字串(mask 可以理解為一個以字元ascii值為鍵值的hash表)。然後執行操作跟去移除一個字元類似,只是結束條件是尋找到第一個不在字元表裡的元素。
預設:
處理方式跟之前一樣,只是移除內容限制在ascii碼小於32(即空格)的字元。並且只去除'\r','\t','\v','\0','\n'字符
看到這裡,我們所了解到的有一下幾點:
1、trim 預設去除'\r','\t','\v','\0','\n'
2、trim 給定單一字元是循環操作,循環結束條件是第一個不相等的字元
3、trim 多個字元移除,是循環移除,直到遇到第一個不在列表中的字元。
在來看php_charmask這個函數
中間省略部分可以不看,只是對非法資料的一個錯誤回傳。
只要看第一個if的內容。如果字串假設傳入內容what=‘a…f’。 input指標指向a,這個時候滿足if條件,在裡面執行的操作相當於把a,b,c,d,e,f內容加到mask中去。所以所trim是可以指定去除區間的trim(‘abcdefg’,‘a…f’)回傳內容只剩下g。
下面幾個實際的輸出更容易理解:
1、trim('abcdf' , 'fd'); 輸出abc,trim不是按順序的,只要在列表內,統統去掉
2、trim('abccdffff' , 'f'); 輸出abccd, trim會把所有滿足條件的去掉
3、trim('abcdffff' , 'a…d' ); 輸出內容ffff, trim可以指定區間,但是如果你真的想要去除'a…d',就不能用trim了
trim去除列表的性質,在多字節處理的時候就會出現問題了,這也就是為什麼trim對於中文會產生亂碼。
trim('品、' , '、'),'品' utf字元十六進位表示為'e5 93 81', 字串'、'的十六進位表示'e3 80 81 '。在trim中,以位元組計算,utf8中文編碼3個位元組表示一個漢字。因此相當於trim去掉內容是三個字元。這三個字元的十六進位表示為’e3 80 81’。所以最終回傳字串的十六進位表示為’e5 93’,因為81已經被移除了。
trim(‘的、’, ‘、’) 就能回傳正確結果。因為’的’的十六進位表示’e7 9a 84’。
所以trim並不簡單。要隨時記著,trim是去除列表內的所有字符,遇到第一個非列表字符停止! !
#以上是php trim函數的詳細解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!