trim系列函數(shù)是用于去除字符串中首尾的空格或其他字符。ltrim函數(shù)只去除掉字符串首部的字符,rtrim函數(shù)只去除字符串尾部的字符。
trim參數(shù)說明string trim ( string $str [, string $character_mask = ' ' ] )
			character_mask
			默認(rèn)是' '等空白字符。
使用..可以指定一段范圍的字符。此處要注意,'..'左右兩邊是一對合法的范圍值,如果傳遞的是非法的值會報錯。
運行示例先來看看用正常的使用:
$str = 'hello..';$new_str = trim($str, '.'); // 結(jié)果是hello
一個比較詭異的結(jié)果。這里報錯是因為php把..左右兩邊看作是范圍值,而此處'..'左邊是字符'.',PHP內(nèi)部將認(rèn)為其是一個缺少右邊界的范圍值。
$str = 'hello...';$second_str = trim($str, '...'); // 報錯
第二個參數(shù)使用合法的邊界值:
$str = 'helloabcdefg';$new_str = trim($str, 'a..g'); // 輸出hellotrim執(zhí)行步驟
trim、ltrim、rtrim三個函數(shù)都是調(diào)用了php_do_trim函數(shù),區(qū)別在于第二個參數(shù)mode的不同。本文主要對trim函數(shù)進行分析,ltrim和rtrim函數(shù)跟trim的類似。然后php_do_trim會調(diào)用了php_trim來實現(xiàn)功能,因此trim函數(shù)的核心函數(shù)時php_trim函數(shù)。其執(zhí)行步驟如下:
1、根據(jù)what的值設(shè)置保存過濾字符的mask數(shù)組
2、過濾在字符串首部的待過濾字符
3、過濾在字符串尾部的待過濾字符
php_trim函數(shù)執(zhí)行的流程圖如下:
			
php_trim函數(shù)先調(diào)用了php_charmask,這個函數(shù)試將過濾字符設(shè)置為mask[char] = 1的形式,這樣就是一個哈希數(shù)組,然后可用于后面的判斷。如果第二個參數(shù)是范圍值時,調(diào)用了memset函數(shù)給mask數(shù)組賦值。
在用mode變量判斷是哪種過濾時,此處有一個小優(yōu)化,在PHP內(nèi)部使用的是與運算,而不是多個的判斷條件。該部分代碼如下:
    if (mode & 1) {        for (i = 0; i < len; i++) {            if (mask[(unsigned char)c[i]]) {                trimmed++;            } else {                break;            }        }        len -= trimmed;        c += trimmed;    }    if (mode & 2) {        for (i = len - 1; i >= 0; i--) {            if (mask[(unsigned char)c[i]]) {                len--;            } else {                break;            }        }    }		判斷的過程:
1 && 1 == 1 左邊需要過濾
2 && 1 == 0 左邊不需要過濾
3 && 1 == 1 左邊需要過濾
1 && 2 == 0 右邊不需要過濾
2 && 2 == 1 右邊需要過濾
3 && 2 == 1 右邊需要過濾
			
			像這樣使用位操作可以提高程序的效率,而且代碼更加簡潔易讀。
閱讀這個函數(shù)的源碼,首先學(xué)習(xí)到在C語言中,如果需要做鍵值對數(shù)組,而且鍵值是單個字符,可以使用unsigned char的類型做數(shù)組下標(biāo),這樣可以構(gòu)造類似字符作為下標(biāo)的映射數(shù)組。
第二個就是使用位運算可以提高程序效率和代碼可讀性。
原創(chuàng)文章,文筆有限,才疏學(xué)淺,文中若有不正之處,萬望告知。
如果本文對你有幫助,請點下推薦吧,謝謝^_^
最后,我在github有對PHP源碼更詳細(xì)的注解。感興趣的可以圍觀一下,給個star。PHP5.4源碼注解。
PHP編程鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
新聞熱點
疑難解答
圖片精選