成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php源碼分析trim函數(shù)的實(shí)現(xiàn)

tolerious / 1379人閱讀

摘要:通過(guò)對(duì)底層源代碼的分析來(lái)說(shuō)一下為什么會(huì)出現(xiàn)這種情況。從代碼可以看到,函數(shù)接受了個(gè)字符串類型的參數(shù),一個(gè)就是需要處理的字符串,第二個(gè)參數(shù)是用來(lái)表示需要去除的字符。實(shí)現(xiàn)返回的操作。

在實(shí)際開(kāi)發(fā)中遇到關(guān)于 trim 函數(shù)的2個(gè)問(wèn)題:
????1:使用trim函數(shù)不能去除2個(gè)以上的連續(xù)點(diǎn)號(hào)(.)
????2 : 使用trim函數(shù)去除字符串的問(wèn)題
先說(shuō)一下第一個(gè)問(wèn)題。
下面的一段代碼:
????php -r "echo trim("abcdcba...","...");"
我的本意是要將字符串abcdcba...最后三個(gè)點(diǎn)去掉,結(jié)果是報(bào)錯(cuò)。

PHP Warning:  trim(): Invalid ".."-range, no character to the left of ".." in Command line code on line 1
Warning: trim(): Invalid ".."-range, no character to the left of ".." in Command line code on line 1
PHP Warning:  trim(): Invalid ".."-range, no character to the right of ".." inCommand line code on line 1
Warning: trim(): Invalid ".."-range, no character to the right of ".." in Command line code on line 1

這個(gè)問(wèn)題其實(shí)很好解釋,因?yàn)?trim 函數(shù)本書(shū)可以范圍操作,例如 如果trim函數(shù)的第二個(gè)參數(shù) a..d,它就會(huì)把a b c d 都去掉。因?yàn)槭÷蕴?hào)的原因,所以trim函數(shù)的第二個(gè)參數(shù)不能用..開(kāi)頭或者結(jié)尾。

第二個(gè)問(wèn)題:
再看一個(gè)例子:
php -r "echo trim("abcdcba","abc")." ";"
我的本意是將字符串abcdcba最前面的abc去掉保留dcba,但結(jié)果卻是這樣的:
d
也就是說(shuō)他會(huì)把a b c分別去掉。這應(yīng)該算是個(gè)坑吧。

通過(guò)對(duì)底層源代碼的分析來(lái)說(shuō)一下為什么會(huì)出現(xiàn)這2種情況。
trim函數(shù)的源代碼師在php代碼根目錄開(kāi)始的 ext/standard/string.c
函數(shù)的定義如下:


PHP_FUNCTION(trim)
{
    php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 3);
}

可以看到,定義調(diào)用了另外的函數(shù),函數(shù)體如下:

static void php_do_trim(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
    char *str;
    char *what = NULL;
    int str_len, what_len = 0;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRM\_CC, "s|s", &str, &str_len, &what, &what_len) == FAILURE) {
        return;
    } 
    php_trim(str, str_len, what, what_len, return_value, mode TSRMLS_CC);
}

zend_parse_parameters函數(shù)的作用就是接受參數(shù),有興趣的同學(xué)可以查閱相關(guān)資料。從代碼可以看到,函數(shù)接受了2個(gè)字符串類型的參數(shù),一個(gè)str,就是需要處理的字符串,第二個(gè)參數(shù)是what,用來(lái)表示需要去除的字符。
這個(gè)函數(shù)在最后用調(diào)用了另外一個(gè)函數(shù),函數(shù)php_trim,函數(shù)體如下:

PHPAPI char *php_trim(char *c, int len, char *what, int what_len, zval *return_value, int mode TSRMLS_DC)
{
    register int i;
    int trimmed = 0;
    char mask[256];
    
        if(what) {
            php_charmask((unsigned char*)what, what_len, mask TSRMLS_CC);
        } else {
            php_charmask((unsigned char*)" 

	v