PHP 中 strpos、strstr 和 stripos、stristr 函数源码解析.docx

PHP 中 strpos、strstr 和 stripos、stristr 函数源码解析.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PHP 中 strpos、strstr 和 stripos、stristr 函数源码解析

strposmixed strpos ( string $haystack, mixed $needle [, int $offset = 0 ] )如果offset指定了,查找会从offset的位置开始。offset不能为负数。返回needle第一次出现在haystack的位置。如果在haystack中找不到needle,则返回FALSE。needle,如果needle不是字符串,它会被转换成整型数值并赋值为该数值的ASCII字符。请看下面例子。例子$str = hello;$pos = strpos($str, 111);// 111的ASCII值是o,因此$pos = 4strpos核心源码if (Z_TYPE_P(needle) == IS_STRING) { if (!Z_STRLEN_P(needle)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, Empty needle); RETURN_FALSE; } // 调用php_memnstr函数查找needle found = php_memnstr(haystack + offset, Z_STRVAL_P(needle), Z_STRLEN_P(needle), haystack + haystack_len); } else { // 如果不是字符串,转换成数字并赋值为该数字的ASCII字符。 if (php_needle_char(needle, needle_char TSRMLS_CC) != SUCCESS) { RETURN_FALSE; } //设置结束字符 needle_char[1] = 0; found = php_memnstr(haystack + offset, needle_char, 1, haystack + haystack_len);  }}有一点要注意的是,如果needle不是字符串的话,会调用php_needle_char函数将needle转成整型数字并转换为其ASCII值。查找函数函数最后返回的是found,php_memnstr函数实现了查找的方法。那么再继续看看php_memnstr函数做了什么:#define php_memnstr zend_memnstrphp_memnstr是函数zend_memnstr的宏定义,查看zend_memnstr函数如下:static 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次 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;}第一个优化,因为(char *)memchr(p, *needle, (end-p+1)是在end – needle_len + 1(即haystack_len+1)中查找,如果p为空,说明needle的第一个字符在p中从未出现过。strstrstring strstr ( string $haystack, mixed $needle [, bool $before_needle = false ] ) 返回needle在haystack中第一次出现的位置到结束的字符串。这个函数的区分大小写的。如果needle在haystack中不存在,返回FALSE。如果before_needle为true,则返回haystack中needle在haystack第一次出现的位置之前的字符串。strstr核心源码if (found) { // 计算出found的位置 found_offset = found - haystack; if (part) { RETURN_

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档