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

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

PHP?strstr函數原型源碼分析

瀏覽:29日期: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久久,三上悠亚国产精品一区二区三区
亚洲一区欧美激情| 亚洲涩涩在线| 日韩免费看片| 欧美一级久久| 午夜国产欧美理论在线播放| bbw在线视频| 久久99久久人婷婷精品综合| 亚洲精品亚洲人成在线观看| 亚洲少妇一区| 丝袜诱惑制服诱惑色一区在线观看| 在线亚洲人成| 欧美天堂视频| 精品国产三区在线| 欧美在线综合| 日韩一级网站| 国产一区日韩一区| 91久久国产| 欧美午夜精彩| 亚洲欧美日韩国产综合精品二区| 国产精品7m凸凹视频分类| 精品欧美激情在线观看| 群体交乱之放荡娇妻一区二区| 福利精品在线| 久久精品毛片| 久久这里只有精品一区二区| 麻豆一区二区三| 国产精品66| 精品九九久久| 国产精一区二区| 视频一区视频二区在线观看| 蜜臀a∨国产成人精品| 亚洲精选久久| 欧美激情在线精品一区二区三区| 国产精品亚洲成在人线| 国产精品mm| 免费在线观看一区| 色一区二区三区四区| 久久久久美女| 国产精品婷婷| 国产乱人伦丫前精品视频| 国产精品久久久久久久久免费高清| 国产一区二区三区久久| 日韩精品中文字幕第1页| 欧美三级网址| 蜜臀91精品国产高清在线观看| 麻豆视频在线看| 成人在线免费观看网站| 精品视频黄色| 精品国产美女a久久9999| 国产一区一一区高清不卡| 久久精品系列| а√在线中文在线新版| 99久久久久国产精品| 亚洲精品成人一区| 国产精品主播| 欧美不卡视频| 在线精品福利| 日韩av在线免费观看不卡| 国产精品资源| av高清不卡| 影音先锋久久精品| 人人爱人人干婷婷丁香亚洲| 中文字幕色婷婷在线视频| 亚洲欧美伊人| 国产日韩亚洲欧美精品| 麻豆免费精品视频| 亚洲天堂1区| 亚洲美女久久| 欧美激情视频一区二区三区在线播放| 青青草视频一区| 国语对白精品一区二区| 婷婷精品视频| 人人精品久久| 日本精品久久| 国产一区二区三区四区大秀| 亚洲国内精品| 老司机精品久久| 青草av.久久免费一区| 蜜桃av在线播放| 亚洲免费影视| 国产精品久久国产愉拍| 日韩在线观看不卡| 免费观看在线色综合| 久久99久久久精品欧美| 蜜桃成人av| 国产精品久久久久9999高清| 99国产精品免费视频观看| 亚洲狼人精品一区二区三区| 国产探花在线精品| 激情久久久久久久| 欧美在线黄色| 神马久久午夜| 日韩精品电影一区亚洲| 久久国产亚洲精品| 国产美女亚洲精品7777| 国产高清一区二区| 国产精品久久久久久久久免费高清| 久久国产精品成人免费观看的软件| 蜜桃一区二区三区在线观看| 精品精品久久| 亚洲一区二区三区免费在线观看 | 亚洲欧洲一区二区天堂久久| 欧美日韩亚洲一区| 亚洲激情社区| 99精品电影| 美女久久久久久| 午夜一级在线看亚洲| 91亚洲国产高清| 国产一区二区三区视频在线| 国产精品一区高清| 日韩专区一卡二卡| 欧美特黄一区| 青青青免费在线视频| 美女av一区| 免费不卡在线观看| 精品1区2区3区4区| 欧美日韩在线观看首页| 精品高清久久| 国产调教精品| 中文精品在线| 国产91精品对白在线播放| 久久女人天堂| 美女精品久久| 国产亚洲精品美女久久久久久久久久| 亚洲精品成人一区| 在线观看免费一区二区| 欧洲激情综合| 久久天堂av| 久久国产日本精品| 久久免费影院| 久久亚洲人体| 国产精品1区| 国产欧美日韩精品一区二区免费 | 亚洲精品在线影院| 精品一区av| 亚洲精品欧美| 亚洲精品中文字幕99999| 性一交一乱一区二区洋洋av| 欧美aa国产视频| 国产 日韩 欧美 综合 一区| 欧美在线看片| 日韩av一二三| 亚洲18在线| 亚洲精品伦理| 亚洲精品女人| 免费成人在线观看| 一区二区91| 国产欧美高清视频在线| 欧美日韩一区二区国产| 国产精品xxx在线观看| 国产日韩欧美在线播放不卡| 欧美日韩精品一区二区三区视频 | 久热精品在线| 日韩中文欧美在线| 日韩免费精品| 欧美日韩亚洲一区在线观看| 国语对白精品一区二区| 成人影视亚洲图片在线| 国产99久久久国产精品成人免费| 久久久精品五月天| 国产精品自在| 国产福利91精品一区二区| 在线一区av| 狠狠色综合网| 性色av一区二区怡红| 欧美久久香蕉| 麻豆精品新av中文字幕| 久久久人人人| 亚洲调教视频在线观看| 免费日本视频一区| 偷拍亚洲精品| 日本欧美国产| 国产一区久久| 91免费精品国偷自产在线在线| 国产精品久久久久久模特 | 亚洲精品乱码| 国产亚洲精品精品国产亚洲综合| 国产精品传媒麻豆hd| 91视频一区| japanese国产精品| 国产一卡不卡| 精品国产第一福利网站| 视频一区二区三区入口| 91九色综合| 亚洲二区精品| 免费久久99精品国产| 水蜜桃精品av一区二区| 久久精品一区二区不卡| 亚洲综合图色| 国产伦精品一区二区三区千人斩| 精品国产麻豆| 中文字幕一区久| 性欧美精品高清| 欧美一区成人| 国产91欧美| 在线综合亚洲| 国产精品xxx| 日韩一区二区三区在线免费观看| 免费日韩精品中文字幕视频在线| 日韩超碰人人爽人人做人人添|