分析strpos,strstr,PHP和striposstristr函数
本文分析了strpos,函数strstr,供大家参考stripos和stristr PHP,详情如下strpos
混合strpos(字符串的草垛,混合针{ int抵消美元,美元= 0 })
如果指定偏移量,则查找将从偏移位置开始。偏移量不能为负。
在草堆里第一次回到针的位置。
如果针不是字符串,它将被转换为整数值,并将值赋给该值的ASCII字符。请看下面的示例。
例子
Hello;
为POS = strpos($str,111);
111 ASCII值是O,所以$ = 4
strpos核心源代码
如果(z_type_p(针)= = is_string){
如果(!z_strlen_p(针)){
php_error_docref(空tsrmls_cc,e_warning,空针);
return_false;
}
/ /电话功能的php_memnstr针
发现= php_memnstr(草垛+偏移,
z_strval_p(针),
z_strlen_p(针),
草垛+ haystack_len);
{人}
如果不是字符串,则转换为数字和数字ASCII字符,用于赋值。
如果(php_needle_char(针,needle_char tsrmls_cc)!=成功){
return_false;
}
设置结尾字符
needle_char { 1 } = 0;
发现= php_memnstr(草垛+偏移,
needle_char,
1,
草垛+ haystack_len);
}
}
有一点要注意的是,如果针不是一个字符串,函数将被调用的php_needle_char把针扎到整数,并将其转换为ASCII值。
查找功能
函数返回的最后发现,php_memnstr函数实现查找方法。然后去看看php_memnstr功能:
#定义php_memnstr zend_memnstr
php_memnstr是函数zend_memnstr宏定义,看着zend_memnstr功能如下:
静态内联字符*
zend_memnstr(char *草垛,char *针,needle_len int,char *结束)
{
干草堆;
needle_len-1 } { char NE =针;
如果(needle_len = = 1){
返回(char *)memchr(P *针,((end-p));
}
如果(needle_len >结束大海捞针){
返回null;
}
/ /第一次优化,才发现端needle_len
结束= needle_len;
当(p端){
第二个/优化,首先确定字符串在开始和结束是相同的,并确定整个字符串
(如果(P =(char *)memchr(P *针,NE(end-p + 1)))= = P { needle_len-1 }){
如果(!Memcmp(针、P、needle_len-1)){
返回p;
}
}
如果(p = NULL){
返回null;
}
++;
}
返回null;
}
一是优化,因为(char *)memchr(P *针,(end-p + 1)是在结束u2013 needle_len + 1(haystack_len + 1)。如果p是空的,则表示针的第一个字符从未出现在p中。
strstr
字符串strstr(字符串的草垛,混合针{美元,美元before_needle =假bool })
返回第一个出现在草堆中的字符串到字符串的结尾。
此函数区分大小写。
如果大海捞针不存在,那就回到错误。
如果before_needle是真实的,在草堆里的第一个位置返回针在草堆字符串。
strstr的核心源代码
如果(发现){
计算找到的位置。
found_offset =发现草堆;
如果(部分){
return_stringl(草垛,found_offset,1);
{人}
return_stringl(发现,haystack_len - found_offset,1);
}
}
strstr函数的前半部分是类似于strpos,不同的是,strstr函数需要返回到草堆的部分字符串位置时发现,部分变量是before_needle变量时是经过strstr函数被调用。
stripos
混合stripos(字符串的草垛,字符串的针{,int偏移= 0美元})
不区分大小写的strpos。实施类似于以下,主要使用复制和转换,需要比小写字母然后再次抬头的琴弦。
stristr
字符串stristr(字符串的草垛,混合针{美元,美元before_needle =假bool })是大小写不敏感的strstr。
Core source code
草堆的复制品。
haystack_dup = estrndup(草垛,haystack_len);
如果(z_type_p(针)= = is_string){
char * orig_needle;
如果(!z_strlen_p(针)){
php_error_docref(空tsrmls_cc,e_warning,空针);
依芙利特(haystack_dup);
return_false;
}
orig_needle = estrndup(z_strval_p(针),z_strlen_p(针));
Call the php_stristr function to find the orig_needle / / value.
发现= php_stristr(haystack_dup,orig_needle,haystack_len,z_strlen_p(针));
依芙利特(orig_needle);
{人}
如果(php_needle_char(针,needle_char tsrmls_cc)!=成功){
依芙利特(haystack_dup);
return_false;
}
needle_char { 1 } = 0;
发现= php_stristr(haystack_dup,needle_char,haystack_len,1);
}
如果(发现){
found_offset =发现haystack_dup;
如果(部分){
retval_stringl(草垛,found_offset,1);
{人}
retval_stringl(草垛+ found_offset,haystack_len - found_offset,1);
}
{人}
retval_false;
}
释放
依芙利特(haystack_dup);
正如你所看到的,发现是从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);
返回php_memnstr(S,T,t_len,S + s_len);
}
这个函数的功能是将字符串转换成小写,叫php_mennstr函数找到针出现在草堆的首位。
总结
因为strpos / stripos返回的位置,从0开始的位置,因此未能找到更适合的假= = =法官。
阅读PHP的源代码获得了很多。一方面,它可以知道函数的具体实现原理,另一方面,我们可以学习一些编程优化程序。
以上是本文的全部内容,希望能帮助您学习php程序设计。