- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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_
您可能关注的文档
- 日语二级能力考试听力场景词汇总结.doc
- 华南植物园常见鸟类.doc
- matlab名词祥解.doc
- hh初三英语单词表.doc
- SIFT关键代码.docx
- 2009_湖南高考英语听力试题与原文_含答案.doc
- GRE高频1200词.doc
- 2016年高二月期中检测试题.doc
- 常用设计类英语.docx
- 色卡颜色翻译及对照.doc
- 第12课 大一统王朝的巩固 课件(20张ppt).pptx
- 第17课 君主立宪制的英国 课件.pptx
- 第6课 戊戌变法 课件(22张ppt).pptx
- 第三章 物态变化 第2节_熔化和凝固_课件 (共46张ppt) 人教版(2024) 八年级上册.pptx
- 第三章 物态变化 第5节_跨学科实践:探索厨房中的物态变化问题_课件 (共28张ppt) 人教版(2024) 八年级上册.pptx
- 2025年山东省中考英语一轮复习外研版九年级上册.教材核心考点精讲精练(61页,含答案).docx
- 2025年山东省中考英语一轮复习(鲁教版)教材核心讲练六年级上册(24页,含答案).docx
- 第12课近代战争与西方文化的扩张 课件(共48张ppt)1.pptx
- 第11课 西汉建立和“文景之治” 课件(共17张ppt)1.pptx
- 唱歌 跳绳课件(共15张ppt内嵌音频)人音版(简谱)(2024)音乐一年级上册第三单元 快乐的一天1.pptx
最近下载
- 肝囊肿开窗引流术后护理查房.pptx
- 芯源微 -国内涂胶显影设备龙头, 国内涂胶显影设备龙头, 国内涂胶显影设备龙头, 布局化学清洗和 布局化学清洗和先进封装 先进封装 20240625 -西部证券.docx
- 2023-2024年EMS审核知识统考试题及答案汇总.pdf VIP
- 一种标示牌粘贴工具.pdf VIP
- DBJ50_T-157-2022 房屋建筑和市政基础设施工程施工现场从业人员配备标准.docx
- 云南省保山市隆阳区金厂河铜锌铁多金属矿矿床水文地质特征.doc VIP
- 电化学阻抗谱(EIS)原理及谱图分析.pptx
- 中班-科学-前进!磁力车(磁铁同极相斥、异极相吸)-课件(互动版).pptx
- 柳永《八声甘州》优质课件.ppt
- 道德与法治五年级上册第四单元传统美德 源远流长 教学设计.pdf
文档评论(0)