strpos和php strstr函数两个函数的区别

PHP中strpos、strstr和stripos、stristr函数分析_php技巧
作者:用户
本文讲的是PHP中strpos、strstr和stripos、stristr函数分析_php技巧,
本文为大家分析了 PHP中strpos、strstr和stripos、stristr函数,供大家参考,具体内容如下
mixed strpos ( string $haystack, mixed $needle [, int
本文为大家分析了 中strpos、strstr和stripos、stristr函数,供大家参考,具体内容如下
mixed 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 = 4
strpos核心源码
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);
// 如果不是字符串,转换成数字并赋值为该数字的ASCII字符。
if (php_needle_char(needle, needle_char TSRMLS_CC) != SUCCESS) {
RETURN_FALSE;
//设置结束字符
needle_char[1] = 0;
found = php_memnstr(haystack + offset,
needle_char,
haystack + haystack_len);
有一点要注意的是,如果needle不是字符串的话,会调用php_needle_char函数将needle转成整型数字并转换为其ASCII值。
函数最后返回的是found,php_memnstr函数实现了查找的方法。那么再继续看看php_memnstr函数做了什么:
#define php_memnstr zend_memnstr
php_memnstr是函数zend_memnstr的宏定义,查看zend_memnstr函数如下:
static inline char *
zend_memnstr(char *haystack, char *needle, int needle_len, char *end)
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_
while (p &= end) {
// 第二个优化,先判断字符串的开头和结尾是否一样再判断整个字符串
if ((p = (char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]) {
if (!memcmp(needle, p, needle_len-1)) {
if (p == NULL) {
return NULL;
return NULL;
第一个优化,因为(char *)memchr(p, *needle, (end-p+1)是在end – needle_len + 1(即haystack_len+1)中查找,如果p为空,说明needle的第一个字符在p中从未出现过。
string 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 -
if (part) {
RETURN_STRINGL(haystack, found_offset, 1);
RETURN_STRINGL(found, haystack_len - found_offset, 1);
strstr函数的前半部分跟strpos类似,区别在于strstr函数在找到位置后,需要返回haystack部分的字符串。part变量就是调用strstr函数时传递的before_needle变量。
mixed stripos ( string $haystack, string $needle [, int $offset = 0 ] )
不区分大小写的strpos。实现方式跟下面的类似,主要是使用一份拷贝然后将需要比较的字符串转换成小写字符后进行再进行查找。
string stristr ( string $haystack, mixed $needle [, bool $before_needle = false ] ) 不区分大小写的strstr。
// 拷贝一份haystack
haystack_dup = estrndup(haystack, haystack_len);
if (Z_TYPE_P(needle) == IS_STRING) {
char *orig_
if (!Z_STRLEN_P(needle)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty needle");
efree(haystack_dup);
RETURN_FALSE;
orig_needle = estrndup(Z_STRVAL_P(needle), Z_STRLEN_P(needle));
// 调用php_stristr函数找出orig_needle的值。
found = php_stristr(haystack_dup, orig_needle,
haystack_len, Z_STRLEN_P(needle));
efree(orig_needle);
if (php_needle_char(needle, needle_char TSRMLS_CC) != SUCCESS) {
efree(haystack_dup);
RETURN_FALSE;
needle_char[1] = 0;
found = php_stristr(haystack_dup, needle_char,
haystack_len, 1);
if (found) {
found_offset = found - haystack_
if (part) {
RETVAL_STRINGL(haystack, found_offset, 1);
RETVAL_STRINGL(haystack + found_offset, haystack_len - found_offset, 1);
RETVAL_FALSE;
// 释放变量
efree(haystack_dup);
可以知道,found是从php_stristr中得到的,继续查看php_stristr函数:
PHPAPI char *php_stristr(char *s, char *t, size_t s_len, size_t t_len)
php_strtolower(s, s_len);
php_strtolower(t, t_len);
return php_memnstr(s, t, t_len, s + s_len);
这个函数的功能就是将字符串都转成小写之后调用php_mennstr函数来查找needle在haystack第一次出现的位置。
因为strpos/stripos返回的是位置,位置从0开始计算,所以判断查找失败都用=== FALSE更适合。
阅读PHP的源码收获挺多,一方面可以知道某个函数的具体实现原理是怎样的,另一方面可以学习到一些编程优化方案。
以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
stripos stristr、strpos stripos、php strpos stripos、php strpos 与stripos、strstr stristr,以便于您获取更多的相关知识。
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!strpos和strstr两个函数的区别_百度知道
strpos和strstr两个函数的区别
我有更好的答案
//支持特殊字符&quot,比如对中文就不能很好支持。
结合上面实例我们得出结论 strstr 区别大小写,从字符开始找如果有返回true否则就返回false
stristr 字符不区别大小写,从字符开始找如果有返回true否则就返回false strpos 区别大小写strpos查找成功后则是返回的是位置。因为位置有可能是0,所以判断查找失败使用===false更合适。 if(strstr($HTTP_SERVER_VARS[HTTP_USER_AGENT], &quot,则使用strpos较好,如果只是判断needle是否在字符串haystack中。
相对于前两者查找成功后返回的是字符,strpos查找成功后则是返回的是位置。因为位置有可能是0,所以判断查找失败使用===false更合适。
strpos的性能比较好;&quotstring strstr(string haystack,string needle) 返回haystack中从第一 个needle开头到haystack末尾的字符串;对&&#47。 如果未找到needle 返回false。 int strpos(string haystack, string needle [;/&和中文字符 if(strpos($HTTP_SERVER_VARS[HTTP_USER_AGENT]: 这个函数是大小写敏感的。 stristr与strstr 的区别就是stristr不分区大小写。但是strpos对特殊字符支持不好;5, &Mozilla/5.0&quot, string needle) 返回haystack中从needle开始到结束的字符串;Mozilla&#47. 如果没有返回值,即没有发现needle,则返回FALSE
注,它将占用更少的内存和获得更快的执行速度;))
/&#47,int offset])
返回haystack中第一个出现needle的位置数字量。 如果未找到needle返回false。
strchr 返回找到字符第1次出现和后面的字符串(字符串) strpos 返回找到字符串出现第1次字符位置(数字) strstr -- 返回字符串中从某指定字符开始到结束处的字符串。 语法: string strstr ( string haystack
采纳率:89%
来自团队:
为您推荐:
其他类似问题
strstr的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。2016年5月 总版技术专家分月排行榜第二
2016年10月优秀大版主2016年8月论坛优秀大版主
2016年5月 总版技术专家分月排行榜第二
2016年10月优秀大版主2016年8月论坛优秀大版主
2016年10月优秀大版主2016年8月优秀大版主
2017年12月 总版技术专家分月排行榜第二2016年9月 总版技术专家分月排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2015年11月 扩充话题大版内专家分月排行榜第一2015年7月 扩充话题大版内专家分月排行榜第一2015年1月 扩充话题大版内专家分月排行榜第一2014年9月 扩充话题大版内专家分月排行榜第一(补)2013年9月 扩充话题大版内专家分月排行榜第一2013年8月 扩充话题大版内专家分月排行榜第一2013年7月 扩充话题大版内专家分月排行榜第一
2016年3月 扩充话题大版内专家分月排行榜第二2015年12月 扩充话题大版内专家分月排行榜第二2015年6月 扩充话题大版内专家分月排行榜第二2015年2月 扩充话题大版内专家分月排行榜第二2014年10月 扩充话题大版内专家分月排行榜第二2014年8月 扩充话题大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)PHP strrpos strpos strstr strrchr 区别 - 出发的兰彻 - 博客园
随笔 - 65, 文章 - 0, 评论 - 7, 引用 - 0
1. strstr&
string&strstr&(&string&$haystack&,&&$needle&[,&bool&$before_needle&= false&] )
$needle 为字符串,如果不是字符串,那么转化为整型,使用该整型对应的字符。
返回 该字符(串)首次出现到字符串尾部分, 包括该字符(串)。
2. &strrchr
string&strrchr&(&string&$haystack&,&&$needle&)
$needle为字符, 如果是字符串,使用字符串的首字符作为匹配字符(区别于其他几个函数对字符串情况的处理), 如果不是字符也不是字符串,则转化为整型,使用该整型对应的字符。
返回该字符最后一次出现到字符串尾部分, 包括该字符。
int&strpos&(&string&$haystack&,&&$needle&[,&int&$offset&= 0&] )
返回某个字符串第一次出现的位置,&如果&needle&不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。
4. strrpos
返回某个字符最后一次出现的位置,&如果&needle&不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。
$str = '';
echo strstr($str,'qq.'); // 返回 qq.com
echo "\n";
echo strrchr($str, 'ch'); // 返回 com 注意返回不是
echo "\n";
echo strpos($str, 'c'); //返回 7
echo "\n";
echo strrpos($str, 'c'); // 返回14}

我要回帖

更多关于 strstr和strpos 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信