亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

更多QQ空间微信QQ好友腾讯朋友复制链接
您的位置:首頁(yè)/技術(shù)文章
文章詳情頁(yè)

PHP?strstr函數(shù)原型源碼分析

【字号: 作者:豬豬瀏覽:2日期:2022-06-14 09:37:42
目錄strstr函數(shù)原型源碼分析 版本PHP5.3.291、ext/standard/php_string.h2、ext/standard/string.czval *needle1、char *haystack2、zend_parse_parameters3、if (Z_TYPE_P(needle) == IS_STRING)4、if (!Z_STRLEN_P(needle)) {5、php_memnstr(haystack, Z_STRVAL_P(needle), Z_STRLEN_P(needle), haystack + haystack_len);核心函數(shù)zend_memnstr 代碼分析strstr函數(shù)原型

源碼分析 版本PHP5.3.291、ext/standard/php_string.hPHP_FUNCTION(strstr);2、ext/standard/string.cPHP_FUNCTION(strstr){ zval *needle; char *haystack; int haystack_len; char *found = NULL; char needle_char[2]; long found_offset; zend_bool part = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 'sz|b', &haystack, &haystack_len, &needle, &part) == FAILURE) {return; } if (Z_TYPE_P(needle) == IS_STRING) {if (!Z_STRLEN_P(needle)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, 'Empty delimiter'); RETURN_FALSE;}found = php_memnstr(haystack, Z_STRVAL_P(needle), Z_STRLEN_P(needle), haystack + haystack_len); } else {if (php_needle_char(needle, needle_char TSRMLS_CC) != SUCCESS) { RETURN_FALSE;}needle_char[1] = 0;found = php_memnstr(haystack, needle_char, 1, haystack + haystack_len); } if (found) {found_offset = found - haystack;if (part) { RETURN_STRINGL(haystack, found_offset, 1);} else { RETURN_STRINGL(found, haystack_len - found_offset, 1);} } RETURN_FALSE;}zval *needle

文件位置 Zend/zend.h

typedef struct _zval_struct zval;struct _zval_struct { /* Variable information */ zvalue_value value;/* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc;};

needle是一個(gè)變量結(jié)構(gòu)體,對(duì)應(yīng)php strstr 函數(shù)參數(shù) mixed $needle

1、char *haystack

char *haystack s是一個(gè)字符指針,對(duì)應(yīng) php strstr函數(shù)參數(shù) string $haystack

2、zend_parse_parameters

文件位置 Zend/zend_API.c

int zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, ...);int zend_parse_parameters_ex(int flags, int num_args TSRMLS_DC, char *type_spec, ...);ZEND_API int zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, ...) /* {{{ */{ va_list va; int retval; RETURN_IF_ZERO_ARGS(num_args, type_spec, 0); va_start(va, type_spec); retval = zend_parse_va_args(num_args, type_spec, &va, 0 TSRMLS_CC); va_end(va); return retval;}/* }}} */ZEND_API int zend_parse_method_parameters(int num_args TSRMLS_DC, zval *this_ptr, char *type_spec, ...) /* {{{ */{ va_list va; int retval; char *p = type_spec; zval **object; zend_class_entry *ce; if (!this_ptr) {RETURN_IF_ZERO_ARGS(num_args, p, 0);va_start(va, type_spec);retval = zend_parse_va_args(num_args, type_spec, &va, 0 TSRMLS_CC);va_end(va); } else {p++;RETURN_IF_ZERO_ARGS(num_args, p, 0);va_start(va, type_spec);object = va_arg(va, zval **);ce = va_arg(va, zend_class_entry *);*object = this_ptr;if (ce && !instanceof_function(Z_OBJCE_P(this_ptr), ce TSRMLS_CC)) { zend_error(E_CORE_ERROR, '%s::%s() must be derived from %s::%s',ce->name, get_active_function_name(TSRMLS_C), Z_OBJCE_P(this_ptr)->name, get_active_function_name(TSRMLS_C));}retval = zend_parse_va_args(num_args, p, &va, 0 TSRMLS_CC);va_end(va); } return retval;}

最簡(jiǎn)單的獲取函數(shù)調(diào)用者傳遞過來(lái)的參數(shù)便是使用zend_parse_parameters()函數(shù)。

zend_parse_parameters() 函數(shù)的前幾個(gè)參數(shù)我們直接用內(nèi)核里宏來(lái)生成便可以了,形式為:ZEND_NUM_ARGS() TSRMLS_CC,注意兩者之間有個(gè)空格,但是沒有逗號(hào)。從名字可以看出,ZEND_NUM_ARGS()代表著參數(shù)的個(gè)數(shù)。

緊接著需要傳遞給zend_parse_parameters()函數(shù)的參數(shù)是一個(gè)用于格式化的字符串,就像printf的第一個(gè)參數(shù)一樣。下面表示了最常用的幾個(gè)符號(hào)。

type_spec是格式化字符串,其常見的含義如下:參數(shù) 代表著的類型b Booleanl Integer 整型d Floating point 浮點(diǎn)型s String 字符串r Resource 資源a Array 數(shù)組o Object instance 對(duì)象O Object instance of a specified type 特定類型的對(duì)象z Non-specific zval 任意類型~Z zval**類型f 表示函數(shù)、方法名稱,PHP5.1里貌似木有... ...

3、if (Z_TYPE_P(needle) == IS_STRING)Z_TYPE_P文件位置:Zend/zend_operators.h#define Z_TYPE_P(zval_p) Z_TYPE(*zval_p)#define Z_TYPE(zval)(zval).type4、if (!Z_STRLEN_P(needle)) {Z_STRLEN_P文件位置:Zend/zend_operators.h#define Z_STRLEN_P(zval_p)Z_STRLEN(*zval_p)#define Z_STRLEN(zval) (zval).value.str.len5、php_memnstr(haystack, Z_STRVAL_P(needle), Z_STRLEN_P(needle), haystack + haystack_len);文件位置:main/php.h#define php_memnstr zend_memnstr文件位置:Zend/zend_operators.hstatic inline char *zend_memnstr(char *haystack, char *needle, int needle_len, char *end){ char *p = haystack; char ne = needle[needle_len-1]; if (needle_len == 1) {return (char *)memchr(p, *needle, (end-p)); } if (needle_len > end-haystack) {return NULL; } end -= needle_len; while (p <= end) {if ((p = (char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]) { if (!memcmp(needle, p, needle_len-1)) {return p; }}if (p == NULL) { return NULL;}p++; } return NULL;}核心函數(shù)memchr memcmp

zend_memnstr 代碼分析

舉例:

strstr('hello word!','world');zend_memnstr(char *haystack, char *needle, int needle_len, char *end)char *haystack = 'hello word!';char *needle = 'world';int needle_len = strlen(needle);char *end = haystack + strlen(haystack) 尾部指針char *p = haystack 字符首元素地址char ne = needle[needle_len-1] needle 尾部單個(gè)字符 dend -= needle_len // 初始:4231185 減后:4231180(p = (char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]p = (char *)memchr(p, *needle, (end-p+1) // char *p = 'world!';ne == p[needle_len-1] // p[needle_len-1] == dif (!memcmp(needle, p, needle_len-1)) //world == worldreturn p

引用

https://www.runoob.com/cprogramming/c-function-memcmp.html

https://www.jb51.net/article/77667.htm

https://www.jb51.net/article/210253.htm

以上就是PHP strstr源碼分析的詳細(xì)內(nèi)容,更多關(guān)于PHP strstr的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: PHP
主站蜘蛛池模板: 久久国产亚洲高清观看5388 | 四虎澳门永久8848在线影院 | 九九视频高清视频免费观看 | 国产免费高清视频在线观看不卡 | 国产玖玖在线 | 精品一区二区三区色花堂 | 有码中文字幕 | 午夜两性mp4 | 国产精品久久福利网站 | 亚洲综合激情另类专区 | 精品日韩欧美一区二区三区在线播放 | 中国xx爽69护士 | 久久久999久久久精品 | 视频二区 调教中字 知名国产 | 亚洲国产精品一区二区首页 | 日韩一级特黄 | 国产精品久久不卡日韩美女 | 精品国产电影 | 三级黄色免费网站 | 1024亚洲精品国产 | 国产亚洲欧美久久精品 | 免费又色又爽的视频国产 | 98精品全国免费观看视频 | 香港三级欧美国产精品 | 欧美一级黄色录像片 | 日韩不卡手机视频在线观看 | 国产第一区精品视频ai换脸 | 久久久久久久久a免费 | 国产一级一级一级国产片 | 91高清在线成人免费观看 | 天天在线天天看成人免费视频 | 亚洲第一视频网 | 国产2021精品视频免费播放 | 国产一区二区三区播放 | 亚洲综合亚洲国产尤物 | 日本国产最新一区二区三区 | 国产成人cao在线 | 9久9久女女免费精品视频在线观看 | 玖玖爱在线播放 | 一级做一级爱a做片性视频视频 | 亚洲午夜精品国产电影在线观看 |