日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP?strstr函數原型源碼分析

瀏覽:31日期:2022-06-14 09:37:42
目錄strstr函數原型源碼分析 版本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);核心函數zend_memnstr 代碼分析strstr函數原型

源碼分析 版本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是一個變量結構體,對應php strstr 函數參數 mixed $needle

1、char *haystack

char *haystack s是一個字符指針,對應 php strstr函數參數 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;}

最簡單的獲取函數調用者傳遞過來的參數便是使用zend_parse_parameters()函數。

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

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

type_spec是格式化字符串,其常見的含義如下:參數 代表著的類型b Booleanl Integer 整型d Floating point 浮點型s String 字符串r Resource 資源a Array 數組o Object instance 對象O Object instance of a specified type 特定類型的對象z Non-specific zval 任意類型~Z zval**類型f 表示函數、方法名稱,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;}核心函數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 尾部單個字符 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源碼分析的詳細內容,更多關于PHP strstr的資料請關注好吧啦網其它相關文章!

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
аⅴ资源天堂资源库在线| 亚洲深深色噜噜狠狠爱网站| 久久国产精品色av免费看| 在线精品亚洲| 亚洲精品系列| 91精品麻豆| 日韩av网站在线观看| 日韩高清中文字幕一区| 亚洲精品国模| 日韩国产在线观看一区| 欧美日韩精品一区二区三区视频 | 日本不卡视频在线| 亚洲精品成人一区| 日本一区福利在线| 国产午夜一区| 国产66精品| 91精品一区国产高清在线gif| 日韩成人精品一区二区| 日本а中文在线天堂| 另类中文字幕国产精品| 亚洲网站视频| 老司机精品久久| 日本一不卡视频| 蜜桃久久久久| 久久一级电影| 亚洲久久视频| 免费在线亚洲欧美| 日韩伦理在线一区| 婷婷六月综合| 日韩福利视频一区| 亚洲午夜天堂| 欧美综合二区| 午夜久久av| 精品国产亚洲一区二区三区大结局 | 中文一区一区三区免费在线观| 日韩av中文字幕一区二区| 国产另类在线| 午夜精品久久久久久久久久蜜桃| 99亚洲视频| 国产精品日本一区二区三区在线| 成人欧美一区二区三区的电影| 另类激情亚洲| 欧美啪啪一区| 亚洲成av人片一区二区密柚| 中文字幕乱码亚洲无线精品一区| 国产欧美日韩视频在线| 欧美日韩水蜜桃| 欧美午夜三级| 欧美/亚洲一区| 国产亚洲观看| 性欧美69xoxoxoxo| 欧美天堂一区二区| 久久国产小视频| 日本视频在线一区| 视频小说一区二区| 91九色综合| 精品成人免费一区二区在线播放| 在线亚洲国产精品网站| 国产精品22p| 国产亚洲午夜| 国产精品巨作av| 欧美精品自拍| 精品一区二区三区中文字幕视频 | 麻豆视频在线观看免费网站黄| 喷白浆一区二区| 国产美女高潮在线| 日韩精品亚洲专区在线观看| 久久精品免费一区二区三区| 欧美私人啪啪vps| 肉色欧美久久久久久久免费看| 色狠狠一区二区三区| 久久高清精品| 精品一区不卡| 日韩精品欧美大片| 一区福利视频| 高清一区二区| 欧美久久久网站| 亚洲在线观看| 99精品电影| 91麻豆国产自产在线观看亚洲| 青草国产精品| aⅴ色国产欧美| 日韩专区精品| 国产一区二区三区91| 综合亚洲色图| 精品1区2区3区4区| 色综合www| 精品一区二区三区中文字幕| 欧美在线91| 日韩中文字幕麻豆| 婷婷丁香综合| 久久精品国产99久久| 国产精品二区不卡| 欧美国产专区| 欧美日韩亚洲一区二区三区在线 | 日韩高清在线一区| 日韩一区精品字幕| 久久高清精品| 亚洲伊人av| 欧美激情另类| 国产在线观看91一区二区三区| 国产精品黄色| 国产欧美日韩在线一区二区| 亚洲男人在线| 亚洲影视一区二区三区| 亚洲一区二区三区四区五区午夜| 国产综合精品一区| 国产91一区| 久久中文视频| 99精品在线观看| 久久国产小视频| 亚洲高清二区| 亚洲第一区色| 久久国产影院| 亚洲精品一区三区三区在线观看| 岛国av在线网站| 亚洲女同av| 日韩欧美自拍| 欧洲一级精品| 女主播福利一区| 欧美精品自拍| 亚洲一区日本| 亚洲午夜久久| 69堂免费精品视频在线播放| 国产日韩欧美中文在线| 国产精品va视频| 国产在视频一区二区三区吞精| 久久av日韩| 成人在线免费观看网站| av中文资源在线资源免费观看| 国产一二在线播放| 色88888久久久久久影院| 亚洲欧美伊人| 蜜桃久久久久久| 亚洲精品美女91| 日韩av电影一区| 麻豆国产欧美一区二区三区| 激情中国色综合| 久久一区二区中文字幕| 亚洲一区久久| 日本午夜精品| 麻豆91精品91久久久的内涵| 在线天堂资源www在线污| 国产高潮在线| 美女网站一区| 亚洲狼人精品一区二区三区| 91精品丝袜国产高跟在线| 美女精品久久| 韩国三级一区| 欧美专区18| 国产欧美日韩| 午夜精品成人av| 美女精品在线| 国产精品高清一区二区| 不卡一二三区| 丝袜亚洲另类欧美| 国产精品视频一区二区三区综合| 久久毛片亚洲| 欧美特黄一区| 国产精品亚洲欧美日韩一区在线| 日韩电影免费网址| 一区二区三区网站| 久久久久九九精品影院| 久久国产中文字幕| 日韩动漫一区| 久久中文视频| 欧美黄色网页| 青青国产91久久久久久| 欧美日韩水蜜桃| 久久精品青草| 99久久精品费精品国产| 国产一区二区视频在线看| 青青草91久久久久久久久| 狠狠干综合网| 亚洲先锋成人| 福利精品一区| 亚洲精品1区2区| 国产精品视频一区二区三区四蜜臂| 欧美xxxx中国| 久久亚洲美女| 国产a久久精品一区二区三区| 91久久国产| 国产精品成人一区二区网站软件| 久久精品官网| 欧美自拍一区| 99精品国产一区二区三区| 日韩高清一区二区| 日韩免费小视频| 亚洲欧美日韩视频二区| 国产精品视频首页| 五月天激情综合网| 欧美精品不卡| 国产视频一区免费看| 精品国产一区二| 亚洲精品中文字幕99999| 激情黄产视频在线免费观看| 精品国产18久久久久久二百| 日韩精品欧美大片| 国产麻豆一区二区三区| 97久久中文字幕|