国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP源碼閱讀]trim rtrim ltrim函數(shù)

2020-03-22 17:56:08
字體:
供稿:網(wǎng)友
  • trim系列函數(shù)是用于去除字符串中首尾的空格或其他字符。ltrim函數(shù)只去除掉字符串首部的字符,rtrim函數(shù)只去除字符串尾部的字符。

    trim

    string trim ( string $str [, string $character_mask = ' ' ] )

    參數(shù)說明

    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'); // 輸出hello
    trim執(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 右邊需要過濾


    像這樣使用位操作可以提高程序的效率,而且代碼更加簡潔易讀。

    小結(jié)

    閱讀這個函數(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)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 贺州市| 清原| 台东县| 望都县| 仁布县| 上虞市| 佛坪县| 北安市| 大理市| 大厂| 琼结县| 沙雅县| 阳原县| 横山县| 德化县| 宁海县| 元氏县| 安龙县| 县级市| 贺州市| 张北县| 太原市| 渝北区| 罗源县| 白河县| 晋州市| 闻喜县| 承德市| 遵义市| 清新县| 盐源县| 贵阳市| 明水县| 寻甸| 南江县| 当涂县| 汕头市| 聂荣县| 峨山| 正安县| 徐闻县|