1. 程式人生 > >php內置函數分析之strtoupper()、strtolower()

php內置函數分析之strtoupper()、strtolower()

ring per AS gist 一個 lower 進入 轉換 ram

strtoupper():

 1 PHP_FUNCTION(strtoupper)
 2 {
 3     zend_string *str;
 4 
 5     ZEND_PARSE_PARAMETERS_START(1, 1)
 6         Z_PARAM_STR(str)
 7     ZEND_PARSE_PARAMETERS_END();
 8 
 9     RETURN_STR(php_string_toupper(str));
10 }

主要實現在 php_string_toupper()函數:

 1 PHPAPI zend_string *php_string_toupper(zend_string *s)
2 { 3 unsigned char *c, *e; 4 5 c = (unsigned char *)ZSTR_VAL(s); //字符串首地址 6 e = c + ZSTR_LEN(s); // 字符串末尾之後的地址,指向字符串結束標誌"\0" 7 8 while (c < e) { 9 if (islower(*c)) { //遇到第一個小寫字符,則進入此if分支,對之後字符的操作都將在此if中完成 10 register unsigned char *r; 11 zend_string *res = zend_string_alloc(ZSTR_LEN(s), 0
); //開辟內存存放zend_string類型數據 12 13 if (c != (unsigned char*)ZSTR_VAL(s)) { //c不是字符串首地址時,執行此if 14 memcpy(ZSTR_VAL(res), ZSTR_VAL(s), c - (unsigned char*)ZSTR_VAL(s)); //將c位置之前的字符數據復制給res 15 } 16 r = c + (ZSTR_VAL(res) - ZSTR_VAL(s)); // 開始進行轉換的位置 17 //
下面的while中對每個字符都執行大寫轉換操作 18 while (c < e) { 19 *r = toupper(*c); 20 r++; 21 c++; 22 } 23 *r = \0; //為字符串添加結束標誌 24 return res; //返回新字符串 25 } 26 c++; 27 } 28 return zend_string_copy(s); //原始字符串沒有被操作,則返回原始字符串,並將引用+1 29 }

strtolower()與之類似。

php內置函數分析之strtoupper()、strtolower()