我的博客https://mengkang.net/1039.html运行如下代码:$tag="Internetproducts,";$text=rtrim($tag,",");print_r($text);我们可能认为我们会得到的结果是互联网产品,但实际结果是互联网产品。为什么会这样?科普PHP使用mb_前缀的都是多字节函数http://php.net/manual/zh/ref....比如$str="abcd";print_r(strlen($str)."\n");//4print_r(mb_strlen($str)."\n");//4$str="周孟康";print_r(strlen($str)."\n");//9print_r(mb_strlen($str)."\n");//3mb_系列函数以“一个字符由多个字节组成”的粒度进行操作,没有mb_的函数按照实际字节数进行操作。原理trim函数文档stringtrim(string$str[,string$character_mask="\t\n\r\0\x0B"])该函数不是多字节函数,即中文等多字节字符characters,它会将其头部或尾部的单个字节与后面的$character_mask对应的char数组进行匹配。如果在下面的数组中,则删除,继续匹配。例如:echoltrim("bcdf","abc");//df在下面demo中string_print_char函数中显示:,由三个字节0xe30x800x81组成,character由三个字节0xe50x930x81组成。所以在执行rtrim的时候,会通过字节比较去掉0x81,导致最后出现乱码。源码探查查看PHP7的源码,然后摘录如下小demo,方便大家一起学习。其实学习PHP源码并不难,每天进步一点点。////main.c//trim////Createdby周梦康on2017/10/18.//Copyright?2017年周梦康.保留所有权利。//#include#include#includevoidstring_print_char(char*str);voidphp_charmask(unsignedchar*input,size_tlen,char*mask);char*ltrim(char*str,char*character_mask);char*rtrim(char*str,char*character_mask);intmain(intargc,charconst*argv[]){printf("%s\n",ltrim("bcdf","abc"));string_print_char("品");//e59381string_print_char("、");//e38081printf("%s\n",rtrim("互联网产品、","、"));返回0;}char*ltrim(char*str,char*character_mask){char*res;字符掩码[256];注册size_ti;int修剪=0;size_tlen=strlen(str);php_charmask((unsignedchar*)character_mask,strlen(character_mask),mask);for(i=0;i0){i=len-1;做{if(mask[(unsignedchar)str[i]]){len--;}else{休息;}}while(i--!=0);}res=(char*)malloc(sizeof(char)*(len+1));memcpy(res,str,len);returnres;}voidstring_print_char(char*str){unsignedlongl=strlen(str);对于(inti=0;i0){$i=$len-1;做{$item=mb_substr($string,$i,1,$encoding);如果(in_array($item,$mask)){$len--;}else{休息;}}while($i--!=0);}returnmb_substr($string,0,$len,$encoding);}mb_internal_encoding("UTF-8");$tag="互联网产品,";$encoding=mb_internal_encoding();print_r(mb_rtrim($tag,",,",$编码));当然,你也可以使用正则表达式。通过上面的函数学习,单字节函数和多字节函数你学会了吗?php7相关php_function(trim){php_do_do_trim(internal_function_param_passthru,3);}php_function(rtrim){php_do_trim(php_function_param_parem_param_pass_passthru,2)){zend_string*str;zend_string*what=NULL;ZEND_PARSE_PARAMETERS_START(1,2)Z_PARAM_STR(str)Z_PARAM_OPTIONALZ_PARAM_STR(什么)ZEND_PARSE_PARAMETERS_END();ZVAL_STR(return_value,php_trim(str,(what?ZSTR_V)(what?ZSTR_LEN(what):0),mode));}PHPAPIzend_string*php_trim(zend_string*str,char*what,size_twhat_len,intmode){constchar*c=ZSTR_VAL(str);size_tlen=ZSTR_LEN(str);注册size_ti;size_t修剪=0;字符掩码[256];if(what){if(what_len==1){charp=*what;如果(模式&1){对于(i=0;i0){i=len-1;做{如果(c[i]==p){len--;}else{休息;}}while(i--!=0);}}}else{php_charmask((unsignedchar*)what,what_len,mask);if(mode&1){for(i=0;i0){i=len-1;做{if(mask[(unsignedchar)c[i]]){len--;}else{休息;}}while(i--!=0);}}}}else{if(mode&1){for(i=0;i0){i=len-1;做{if((unsignedchar)c[i]<=''&&(c[i]==''||c[i]=='\n'||c[i]=='\r'||c[i]=='\t'||c[i]=='\v'||c[i]=='\0')){len--;}else{休息;}}while(i--!=0);}}}if(ZSTR_LEN(str)==len){returnzend_string_copy(str);}else{returnzend_string_init(c,len,0);}}/*{{{php_charmask*用输入填充一个256字节的字节掩码。您可以指定一个范围,如“a..z”,*它需要递增。*返回:FAILURE/SUCCESS输入是否正确(即没有范围错误)*/staticinlineintphp_charmask(unsignedchar*input,size_tlen,char*mask){unsignedchar*end;无符号字符c;int结果=成功;memset(掩码,0,256);for(end=input+len;input=c){memset(mask+c,1,input[3]-c+1);输入+=3;}elseif((input+1=input){/*没有'left'字符*/php_error_docref(NULL,E_WARNING,"Invalid'..'-range,'..'左边没有字符");结果=失败;继续;}if(input+2>=end){/*没有'right'字符*/php_error_docref(NULL,E_WARNING,"Invalid'..'-range,nocharactertotherightof'..'");结果=失败;继续;}if(input[-1]>input[2]){/*错误order*/php_error_docref(NULL,E_WARNING,"Invalid'..'-range,'..'-rangeneedsbeincrementing");结果=失败;继续;}/*FIXME:更好的错误(a..b..c是唯一剩下的可能性吗?)*/php_error_docref(NULL,E_WARNING,"Invalid'..'-range");结果=失败;继续;}else{掩码[c]=1;}}returnresult;}/*}}}*/硬广告:我的周末直播,欢迎关注https://segmentfault.com/ls/1...