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 }

 

posted @ 2018-05-27 22:10  S3c0ldW4ng  阅读(388)  评论(0编辑  收藏  举报