這篇文章跟大家分享的內容是關於PHP中strpos函數的深入分析,內容很詳細,有需要的朋友可以參考一下,希望可以幫助到你們。
在php中經常用strpos
判斷字串是否在另一個字串中存在, 本文介紹strpos
函數及其實現。
<?php /* strpos示例 */ // test echo 'match:', strpos('xasfsdfbk', 'xasfsdfbk') !== false ? 'true' : 'false', ';', PHP_EOL; echo 'match:', strpos('xasfsdfbk', 'fbk') !== false ? 'true' : 'false', ';', PHP_EOL; echo 'match:', strpos('xasfsdfbk', 'xs') != false ? 'true' : 'false', ';', PHP_EOL; echo 'match:', strpos('xasfsdfbk', 'sfs') !== false ? 'true' : 'false', ';', PHP_EOL; // code strpos('xasfsdfbk', 'sfs');
Warning:strpos
函數可能會傳回布林值FALSE
,但也可能回傳等同於FALSE
的非布林值。請閱讀 布爾類型章節以獲取更多資訊。應使用===
運算子來測試此函數的傳回值。
函數 | #描述 | 版本 |
---|---|---|
strpos | 找出字串首次出現的位置 | PHP 4, PHP 5, PHP 7 |
stripos | 尋找字串首次出現的位置(不區分大小寫) | PHP 5, PHP 7 |
strrpos | 計算指定字符串在目標字串中最後一次出現的位置 | PHP 4, PHP 5, PHP 7 |
strripos | #計算字串在目標字串中最後一次出現的位置(不區分大小寫) | PHP 5, PHP 7 |
#mb_strpos | 在另一個字串中首次出現的位置 | PHP 4 >= 4.0.6, PHP 5, PHP 7 |
strstr | ##找出字串的首次出現PHP 4, PHP 5, PHP 7 | |
strstr() 函數的忽略大小寫版本 | # PHP 4, PHP 5, PHP 7 | |
#計算字串出現的次數 | ##PHP 4, PHP 5, PHP 7 |
PHP(strpos)原始碼
PHP_FUNCTION(strpos) { zval *needle; zend_string *haystack; char *found = NULL; char needle_char[2]; zend_long offset = 0; #ifndef FAST_ZPP if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sz|l", &haystack, &needle, &offset) == FAILURE) { return; } #else ZEND_PARSE_PARAMETERS_START(2, 3) Z_PARAM_STR(haystack) Z_PARAM_ZVAL(needle) Z_PARAM_OPTIONAL Z_PARAM_LONG(offset) ZEND_PARSE_PARAMETERS_END(); #endif if (offset ZSTR_LEN(haystack)) { php_error_docref(NULL, E_WARNING, "Offset not contained in string"); RETURN_FALSE; } if (Z_TYPE_P(needle) == IS_STRING) { if (!Z_STRLEN_P(needle)) { php_error_docref(NULL, E_WARNING, "Empty needle"); RETURN_FALSE; } found = (char*)php_memnstr(ZSTR_VAL(haystack) + offset, Z_STRVAL_P(needle), Z_STRLEN_P(needle), ZSTR_VAL(haystack) + ZSTR_LEN(haystack)); } else { if (php_needle_char(needle, needle_char) != SUCCESS) { RETURN_FALSE; } needle_char[1] = 0; found = (char*)php_memnstr(ZSTR_VAL(haystack) + offset, needle_char, 1, ZSTR_VAL(haystack) + ZSTR_LEN(haystack)); } if (found) { RETURN_LONG(found - ZSTR_VAL(haystack)); } else { RETURN_FALSE; } }
#define php_memnstr zend_memnstr /* 338 line*/
/* * 此函数的作用是在haystack中查找needle,如果不存在返回null,如果存在,返回指向haystack中needle头字符的指针 */ zend_memnstr(const char *haystack, const char *needle, size_t needle_len, const char *end) { const char *p = haystack; const char ne = needle[needle_len-1]; ptrdiff_t off_p; size_t off_s; if (needle_len == 1) { return (const char *)memchr(p, *needle, (end-p)); } off_p = end - haystack; off_s = (off_p > 0) ? (size_t)off_p : 0; if (needle_len > off_s) { return NULL; } if (EXPECTED(off_s
/* 头文件:#include <string.h> 定义函数:void * memchr(const void *s, char c, size_t n); 函数说明:memchr()从头开始搜寻s 所指的内存内容前n 个字节,直到发现第一个值为c 的字节,则返回指向该字节的指针。 返回值:如果找到指定的字节则返回该字节的指针,否则返回0。 */ #ifndef __HAVE_ARCH_MEMCHR void *memchr(const void *s, int c, size_t n) { const unsigned char *p = s; while (n-- != 0) { if ((unsigned char)c == *p++) { return (void *)(p - 1); } } return NULL; } EXPORT_SYMBOL(memchr); #endif</string.h>
/* 字符串函数memcmp 原型:extern int memcmp(void *buf1, void *buf2, unsigned int count); 功能:比较内存区域buf1和buf2的前count个字节 说明:当buf1<buf2>buf2时,返回值>0 */ #ifndef __HAVE_ARCH_MEMCMP #undef memcmp __visible int memcmp(const void *cs, const void *ct, size_t count) { const unsigned char *su1, *su2; int res = 0; for (su1 = cs, su2 = ct; 0 </buf2>
相關推薦:
PHP中鎖定機制的應用以上是PHP中strpos函數的深入分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!