php内置函数分析之strpos()

Posted 那天ws

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php内置函数分析之strpos()相关的知识,希望对你有一定的参考价值。

 1 php_FUNCTION(strpos)
 2 {
 3     zval *needle;
 4     zend_string *haystack;
 5     char *found = NULL;
 6     char  needle_char[2];
 7     zend_long  offset = 0; // 搜索位置默认0
 8 
 9     ZEND_PARSE_PARAMETERS_START(2, 3)
10         Z_PARAM_STR(haystack)
11         Z_PARAM_ZVAL(needle)
12         Z_PARAM_OPTIONAL
13         Z_PARAM_LONG(offset)
14     ZEND_PARSE_PARAMETERS_END();
15 
16     /* 如果搜索起始位置offset<0, 则转换一下 */
17     if (offset < 0) {
18         offset += (zend_long)ZSTR_LEN(haystack);
19     }
20     /* 如果转换之后 offset<0 或 offset大于(待查找字符串的长度),则待查找字符串中根本就没有这个位置*/
21     if (offset < 0 || (size_t)offset > ZSTR_LEN(haystack)) {
22         php_error_docref(NULL, E_WARNING, "Offset not contained in string");
23         RETURN_FALSE;
24     }
25 
26     /* 搜索 */
27     if (Z_TYPE_P(needle) == IS_STRING) { // needle是字符串
28         /* needle长度为0,则报错 */
29         if (!Z_STRLEN_P(needle)) {
30             php_error_docref(NULL, E_WARNING, "Empty needle");
31             RETURN_FALSE;
32         }
33         /* 具体的搜索实现 */
34         found = (char*)php_memnstr(ZSTR_VAL(haystack) + offset,
35                             Z_STRVAL_P(needle),
36                             Z_STRLEN_P(needle),
37                             ZSTR_VAL(haystack) + ZSTR_LEN(haystack));
38     } else {
39         if (php_needle_char(needle, needle_char) != SUCCESS) {
40             RETURN_FALSE;
41         }
42         needle_char[1] = 0;
43 
44         found = (char*)php_memnstr(ZSTR_VAL(haystack) + offset,
45                             needle_char,
46                             1,
47                             ZSTR_VAL(haystack) + ZSTR_LEN(haystack));
48     }
49 
50     if (found) {
51         RETURN_LONG(found - ZSTR_VAL(haystack));
52     } else {
53         RETURN_FALSE;
54     }
55 }

 

以上是关于php内置函数分析之strpos()的主要内容,如果未能解决你的问题,请参考以下文章

PHP字符串函数之 strpos stripos strrpos strripos

php内置函数分析之strtoupper()strtolower()

php内置函数分析之ucfirst()lcfirst()

php内置函数分析之strrev()

php内置函数分析之str_pad()

PHP strlen()函数和strpos()函数