怎么r语言 查看函数源代码PHP函数的源码

php判断字符串长度 strlen()与mb_strlen()函数-Php常用代码-Php教程-壹聚教程网php判断字符串长度 strlen()与mb_strlen()函数
我们知道在php中要判断字符串长度我们只要使用strlen()与mb_strlen()函数既可以了,但是并不是我们想得这么简单,特别是在对中英文混合时上面函数有点力不从心哦,下面我来给各位朋友介绍。
PHP strlen() 函数
定义和用法
strlen() 函数返回字符串的长度。
strlen(string)
参数:string
描述:必需。规定要检查的字符串。
$str=&中文a字1符&;
echo strlen($str);
echo &&br /&&;
echo mb_strlen($str,&UTF8&);
//输出结果
结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以&中文a字1符&长度是3*4+2=14
在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以&中文a字1符&长度是6
mb_strlen()函数
需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保
&extension=php_mbstring.dll&这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。
$str=&中文a字1符&;
//计算如下
echo (strlen($str) + mb_strlen($str,&UTF8&)) / 2;
//输出结果
&中文a字1符& 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出&中文a字1符&的占位是10.
讲解这两者之间的区别
//测试时文件的编码方式要是UTF8
$str='中文a字1符';
echo&strlen($str).'&br&';//14
echo&mb_strlen($str,'utf8').'&br&';//6
echo&mb_strlen($str,'gbk').'&br&';//8
echo&mb_strlen($str,'gb2312').'&br&';//10
结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以&中文a字1符&长度是3*4+2=14,在mb_strlen
计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以&中文a字1符&长度是6 .
虽然上面函数可以简单解决一些中英文混合问题,但是不能用于实实际中,下面我来给各位朋友介绍其它比较好的办
PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改
* PHP获取字符串中英文混合长度
* @param $str string 字符串
* @param $$charset string 编码
* @return 返回长度,1中文=1位,2英文=1位
function strLength($str,$charset='utf-8'){
if($charset=='utf-8') $str = ('utf-8','gb2312',$str);
$num = strlen($str);
$cnNum = 0;
for($i=0;$i&$$i++){
if(ord(($str,$i+1,1))&127){
$enNum = $num-($cnNum*2);
$number = ($enNum/2)+$cnN
return ceil($number);
//测试输出长度都为15
$str1 = '测试测试测试测试测试测试测试测';
$str2 = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$str3 = 'aa测试aa测试aa测试aa测试aaaaaa';
echo strLength($str1,'gb2312');
echo strLength($str2,'gb2312');
echo strLength($str3,'gb2312');
截取字符串函数
UTF8编码,在UTF8中,一个中文字符占3个字节
function msubstr($str, $start, $len) {
&$tmtr = &&;
&$strlen = $start + $
&for($i = 0; $i & $ $i++){
&&if(ord(substr($str, $i, 1)) & 127){
&&&$tmpstr.=substr($str, $i, 3);
&&&$tmpstr.= substr($str, $i, 1);
echo msubstr(&一二三天下致公english&,0,10);
GB2312编码,在gb2312中,一个中文字符占2个字节
function msubstr($str, $start, $len) {&& //ȡ
&& $tmpstr = &&;
&& $strlen = $start + $
&& if(('/[/d/s]{2,}/',$str)){$strlen=$strlen-2;}
&& for($i = 0; $i & $ $i++) {
&&&&&& if(ord(substr($str, $i, 1)) & 0xa0) {
&&&&&&&&&& $tmpstr .= substr($str, $i, 2);
&&&&&&&&&& $i++;
&&&&&& } else
&&&&&&&&&& $tmpstr .= substr($str, $i, 1);
&& return $
编码兼容性良好的函数
function cc_msubstr($str, $start=0, $length, $charset=&utf-8&, $suffix=true)
&if(function_exists(&mb_substr&))
&&return mb_substr($str, $start, $length, $charset);
&elseif(function_exists('iconv_substr')) {
&&return iconv_substr($str,$start,$length,$charset);
&$re['utf-8']&& = &/[/x01-/x7f]|[/xc2-/xdf][/x80-/xbf]|[/xe0-/xef][/x80-/xbf]{2}|[/xf0-/xff]
[/x80-/xbf]{3}/&;
&$re['gb2312'] = &/[/x01-/x7f]|[/xb0-/xf7][/xa0-/xfe]/&;
&$re['gbk']&& = &/[/x01-/x7f]|[/x81-/xfe][/x40-/xfe]/&;
&$re['big5']&& = &/[/x01-/x7f]|[/x81-/xfe]([/x40-/x7e]|/xa1-/xfe])/&;
&preg_match_all($re[$charset], $str, $match);
&$slice = join(&&,array_slice($match[0], $start, $length));
&if($suffix) return $slice.&&&;
上一页: &&&&&下一页:相关内容怎么在PHPstorm中查找函数 - 开源中国社区
当前访客身份:游客 [
当前位置:
我找了一遍,都没有发现..请求各路神仙有没有遇到过这个问题的.
共有3个回帖
<span class="a_vote_num" id="a_vote_num_
--- 共有 1 条评论 ---
谢谢, 我刚刚找到,是 ctrl+shift+alt+n, 查找函数
(4年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
config-keymap
--- 共有 1 条评论 ---
谢谢,之前不知道函数的名称 在 英文中是 "symbol"
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
不错,正是所需要。 Phpstorm真强大。&
更多开发者职位上
有什么技术问题吗?
多厘的其它问题
类似的话题2636人阅读
PHP本质(57)
&今天和同事在讨论关键字过虑的算法实现,前几天刚看过布隆过滤算法,于是就想起我们公司内部的查找关键字程序,好奇是怎么实现的。于是查找了一下源代码,原来可以简单地用stripos函数查找,stripos原型如下:int stripos ( string $haystack, string $needle [, int $offset] )一般地都会建一个关键词库,然后把输入的内容作为haystack,然后循环遍历一下关键词库,把每个关键词作为needle,如果存在的话则会返回关键字在输入的内容中的位置。于是查找了一下PHP源代码关于这个函数的实现,如果想知道一个函数在PHP的哪个模块的话可以简单写一个函数get_module.&?phpif(substr(php_sapi_name(),0,6)=='cli'){&&&&//命令行模式&&&&global $argv;&&&&$function = $argv[1];}else{&&&&&&&//网页方式&&&&&&&$function = $_GET['name'];}$extensions = get_loaded_extensions();foreach($extensions as $t){&&&&$modules_funcs = get_extension_funcs($t);&&&&if(in_array($function, (array)$modules_funcs)){&&&&&&&&$is_found = true;&&&&&&&&echo &$function is in $t module\n&;&&&&}}if(!$is_found)echo &$function not found&;?&字符串系列的函数属于PHP的标准模块,在ext/standard目录下,string.c。PHP_FUNCTION(stripos){&&&&char *found = NULL;&&&&char *haystack;&&&&int haystack_len;&&&&long offset = 0;&&&&char *needle_dup = NULL, *haystack_dup;&&&&char needle_char[2];&&&&zval *needle;&&&&if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, &sz|l&, &haystack, &haystack_len, &needle, &offset) == FAILURE) {&&&&&&&&return;&&&&}&&&&&&&&检查参数,第一第二个是必选参数,第三个是可选,|表示后面的参数都是可选的。&&&&if (offset & 0 || offset & haystack_len) {&&&&&&&&php_error_docref(NULL TSRMLS_CC, E_WARNING, &Offset not contained in string&);&&&&&&&&RETURN_FALSE;&&&&}&&&&if (haystack_len == 0) {&&&&&&&&RETURN_FALSE;&&&&}&&&&haystack_dup = estrndup(haystack, haystack_len);&&&&&&&&//与大小写无关,所以先把字符全部转换成小写&&&&php_strtolower(haystack_dup, haystack_len);&&&&if (Z_TYPE_P(needle) == IS_STRING) {&&&&&&&&&&&&&&&//第二个参数如果是字符串&&&&&&&&if (Z_STRLEN_P(needle) == 0 || Z_STRLEN_P(needle) & haystack_len) {&&&&&&&&&&&&efree(haystack_dup);&&&&&&&&&&&&RETURN_FALSE;&&&&&&&&}&&&&&&&&needle_dup = estrndup(Z_STRVAL_P(needle), Z_STRLEN_P(needle));&&&&&&&&php_strtolower(needle_dup, Z_STRLEN_P(needle));&&&&&&&&&&&&&&&&//这个是关键,由php_memnstr实现&&&&&&&&found = php_memnstr(haystack_dup + offset, needle_dup, Z_STRLEN_P(needle), haystack_dup + haystack_len);&&&&} else {&&&&&&&&&&&&&&&//第二个参数是数字的话,则强制转换成(char)类型&&&&&&&&switch (Z_TYPE_P(needle)) {&&&&&&&&&&&&case IS_LONG:&&&&&&&&&&&&case IS_BOOL:&&&&&&&&&&&&&&&&needle_char[0] = tolower((char) Z_LVAL_P(needle));&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&case IS_DOUBLE:&&&&&&&&&&&&&&&&needle_char[0] = tolower((char) Z_DVAL_P(needle));&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&default:&&&&&&&&&&&&&&&&php_error_docref(NULL TSRMLS_CC, E_WARNING, &needle is not a string or an integer&);&&&&&&&&&&&&&&&&efree(haystack_dup);&&&&&&&&&&&&&&&&RETURN_FALSE;&&&&&&&&&&&&&&&&break;&&&&&&&&}&&&&&&&&needle_char[1] = '\0';&&&&&&&&found = php_memnstr(haystack_dup + offset,&&&&&&&&&&&&&&&&&&&&&&&&&&&&needle_char,&&&&&&&&&&&&&&&&&&&&&&&&&&&&sizeof(needle_char) - 1,&&&&&&&&&&&&&&&&&&&&&&&&&&&&haystack_dup + haystack_len);&&&&}&&&&efree(haystack_dup);&&&&if (needle_dup) {&&&&&&&&efree(needle_dup);&&&&}&&&&if (found) {&&&&&&&&&&&&&&&&//如何找到,则返回在这个字符串中的位置&&&&&&&&RETURN_LONG(found - haystack_dup);&&&&} else {&&&&&&&&RETURN_FALSE;&&&&}}查找函数是由php_memstr实现的,在main目录下的php.h文件#define php_memnstr zend_memnstr所以真正的函数是zend_memnstr,在zend/目录下面的zend_operators.h,static inline char *zend_memnstr(char *haystack, char *needle, int needle_len, char *end){&&&&char *p = haystack;&&&&char ne = needle[needle_len-1];&&&&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;}查到这里就能看到实现搜索的原理了,主要用了一个while循环和两个C的函数memchr和memcmp。先用第一个函数查找needle的第一个字符在haystack中出现的位置,然后调用memcmp,从这个位置开始比较needle和haystack,如果相同就返回这个位置,没有的话再把指针指向haystack的下一位再进行比较,一直到最后。不过这个搜索只是简单地调用了memchr和memcmp函数,至于memcmp用了什么算法比较两个字符串就不太清楚,我们知道在一个长度为n的字符串里面查找字符串为m的字符串,那么最坏的复杂度是O(n*m),上网搜了一下memcmp,不过没有找到他的实现原理。后来想了一下发现这个其实就是最简单的两次循环遍历进行比较。看了一下PHP的其他几个字符串查找函数strstr,stristr,strpos,strrpos,strripos 等函数都是调用zend_memnstr这个函数实现的,只是在返回的时候内容不同而已。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8925519次
积分:91000
积分:91000
排名:第8名
原创:1532篇
转载:141篇
评论:3915条
(2)(1)(2)(1)(2)(2)(3)(10)(7)(4)(3)(1)(8)(2)(2)(1)(3)(3)(1)(2)(2)(2)(2)(1)(4)(20)(13)(2)(12)(11)(14)(22)(55)(16)(9)(20)(66)(27)(36)(67)(124)(44)(1)(8)(21)(2)(2)(1)(1)(5)(5)(1)(4)(16)(1)(3)(8)(1)(1)(4)(4)(10)(505)(18)(1)(19)(50)(67)(298)因为编写过php的c扩展之后,就想查看一下其他扩展库的源码多事如何写的,也好学习一下,就随便挑了一个php经常用的curl去看,结果在php的ext/curl目录下没有找到curl_setopt()或者curl_setopt_array()等函数的源码,但是有这些函数的定义:
这里面的streams.c里没有,但是最后在interface.c里找到了这些函数的封装:
interface.c里自己封装的_php_curl_setopt()函数,curl_setopt()或者curl_setopt_array()等都是调用了这个函数,这个函数就是对libcurl的curl_easy_setopt()函数进行了调用,所以现在的目标就成了去寻找curl_easy_setopt()到底在哪里。
因为OS X系统应该是有libcurl的,但是我们也可以到libcurl的官网下载一份源码来查看,跟OS X系统里的libcurl除却版本不同,应该大体上是一致的,所以我下载了这个版本:curl-7.40.0 这个版本。
经过查找,果然找到了函数定义,curl_easy_setopt是在easy.c中定义的:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:796492次
积分:11469
积分:11469
排名:第909名
原创:345篇
转载:264篇
评论:36条
(1)(3)(9)(17)(1)(10)(8)(17)(28)(69)(81)(5)(44)(27)(9)(21)(35)(49)(55)(13)(5)(2)(1)(5)(12)(1)(4)(11)(3)(2)(5)(12)(12)(3)(1)(22)(5)(1)

我要回帖

更多关于 matlab查看函数源代码 的文章

 

随机推荐