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 }

 

转载于:https://www.cnblogs.com/natian-ws/p/9097776.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值