|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
模仿的不光是模仿,模仿的同时在加改进,就成了自己的作品了。在比来的项目中,会碰着到或人的手机号码埋没两头几位,身份证号码只显现开端4位的需求。事先一入手下手是网上搜刮了一下,看到有人是用substr_replace这个函数来交换的,前面我也用了这个函数,但在用的时分不是很好用。1、substr_replace先来看看这个函数的语法:substr_replace(string,replacement,start,length)参数形貌string必须。划定要反省的字符串。replacement必须。划定要拔出的字符串。start必须。划定在字符串的那边入手下手交换。 负数-在第start个偏移量入手下手交换 正数-在从字符串开头的第start个偏移量入手下手交换 0-在字符串中的第一个字符处入手下手交换charlist可选。划定要交换几个字符。 负数-被交换的字符串长度 正数-从字符串末了入手下手的被交换字符数 0-拔出而非交换1、当start与charlist都为负数的时分,十分好了解,也很标记人的逻辑,start是从0入手下手的,以下图,依据前提,绿色的将是要被交换的元素2、当start为正数,charlist为负数的时分,也挺好了解的3、当start为负数,charlist为正数的时分,这个我一入手下手了解错了4、当start为正数,charlist为正数的时分,有一个中央必要注重的就是:假如start是正数且length小于即是start,则length为0。这个坑挺简单踩到的5、charlist为0的时分,就酿成拔出了,而不是交换,额。。。用上去,我是感到不是很随手,固然说满意我如今的需求仍是能够的,可是假如未来必要一些扩大的话,耍起来挺费劲的,以是就想到本人机关一个,未来用起来也便利。2、便宜的星号交换函数replaceStar($str,$start,$length=0)参数形貌str必须。划定要反省的字符串。start必须。划定在字符串的那边入手下手交换。 负数-在第start个偏移量入手下手交换 正数-在从字符串开头的第start个偏移量入手下手交换 0-在字符串中的第一个字符处入手下手交换length可选。划定要交换几个字符。 负数-被交换的字符串长度,从左往右 正数-被交换的字符串长度,从右往左 0-假如start为负数,从start入手下手向左到最初 -假如start为正数,从start入手下手向右到最初后面的两个参数与下面的一样,最初的参数与下面分歧1、当start与length都为负数,与substr_replace体现的一样2、当start为正数,length为负数,与substr_replace体现的一样substr_replacereplaceStarstart为负数,长度为正数start为正数,长度为正数start为负数,长度为0做拔出操纵start为正数,长度为0做拔出操纵3、源码分享复制代码publicstaticfunctionreplaceStar($str,$start,$length=0){$i=0;$star=;if($start>=0){if($length>0){$str_len=strlen($str);$count=$length;if($start>=$str_len){//当入手下手的下标年夜于字符串长度的时分,就不做交换了$count=0;}}elseif($length<0){$str_len=strlen($str);$count=abs($length);if($start>=$str_len){//当入手下手的下标年夜于字符串长度的时分,因为是反向的,就从最初谁人字符的下标入手下手$start=$str_len-1;}$offset=$start-$count+1;//出发点下标减往数目,盘算偏移量$count=$offset>=0?abs($length):($start+1);//偏移量年夜于即是0申明没有凌驾最右边,小于0了申明凌驾了最右边,就用出发点到最右边的长度$start=$offset>=0?$offset:0;//从最右边或右边的某个地位入手下手}else{$str_len=strlen($str);$count=$str_len-$start;//盘算要交换的数目}}else{if($length>0){$offset=abs($start);$count=$offset>=$length?$length:$offset;//年夜于即是长度的时分没有超越最右侧}elseif($length<0){$str_len=strlen($str);$end=$str_len+$start;//盘算偏移的开头值$offset=abs($start+$length)-1;//盘算偏移量,因为都是正数就加起来$start=$str_len-$offset;//盘算出发点值$start=$start>=0?$start:0;$count=$end-$start+1;}else{$str_len=strlen($str);$count=$str_len+$start+1;//盘算必要偏移的长度$start=0;}}while($i<$count){$star.=*;$i++;}returnsubstr_replace($str,$star,$start,$count);}复制代码不善于算法,这里就用很一般的逻辑来展现啦,没有效到啥数学公式。1、if($start>=0)这里做start年夜于即是0与小于0的分支2、在start的分当中,分离再做length年夜于0,小于0和即是0的三个分支3、最初盘算出start、count和要交换的星号字符串,最初盘算出的start与count都是负数,使用substr_replace做交换4、单位测试复制代码publicfunctiontestReplaceStar(){$actual=App_Util_String::replaceStar(123456789,3,2);$this->assertEquals($actual,123**6789);$actual=App_Util_String::replaceStar(123456789,9);$this->assertEquals($actual,123456789);$actual=App_Util_String::replaceStar(123456789,9,2);$this->assertEquals($actual,123456789);$actual=App_Util_String::replaceStar(123456789,9,-9);$this->assertEquals($actual,*********);$actual=App_Util_String::replaceStar(123456789,9,-10);$this->assertEquals($actual,*********);$actual=App_Util_String::replaceStar(123456789,9,-11);$this->assertEquals($actual,*********);$actual=App_Util_String::replaceStar(123456789,3);$this->assertEquals($actual,123******);$actual=App_Util_String::replaceStar(123456789,0);$this->assertEquals($actual,*********);$actual=App_Util_String::replaceStar(123456789,0,2);$this->assertEquals($actual,**3456789);$actual=App_Util_String::replaceStar(123456789,3,-3);$this->assertEquals($actual,1***56789);$actual=App_Util_String::replaceStar(123456789,1,-5);$this->assertEquals($actual,**3456789);$actual=App_Util_String::replaceStar(123456789,3,-3);$this->assertEquals($actual,1***56789);$actual=App_Util_String::replaceStar(123456789,-3,2);$this->assertEquals($actual,123456**9);$actual=App_Util_String::replaceStar(123456789,-3,5);$this->assertEquals($actual,123456***);$actual=App_Util_String::replaceStar(123456789,-1,2);$this->assertEquals($actual,12345678*);$actual=App_Util_String::replaceStar(123456789,-1,-2);$this->assertEquals($actual,1234567**);$actual=App_Util_String::replaceStar(123456789,-4,-7);$this->assertEquals($actual,******789);$actual=App_Util_String::replaceStar(123456789,-1,-3);$this->assertEquals($actual,123456***);$actual=App_Util_String::replaceStar(123456789,-1);$this->assertEquals($actual,*********);$actual=App_Util_String::replaceStar(123456789,-2);$this->assertEquals($actual,********9);$actual=App_Util_String::replaceStar(123456789,-9);$this->assertEquals($actual,*23456789);$actual=App_Util_String::replaceStar(123456789,-10);$this->assertEquals($actual,123456789);$actual=App_Util_String::replaceStar(123456789,-10,-2);$this->assertEquals($actual,123456789);}对于PHP的语法结构,刚开始真的很不习惯,真搞不懂为什么每个变量之前都要加个“$”符号,每个语句写完之后都必须加上“分号”来表示此句已经结束,还有,PHP对字母的大小写是敏感的,写的时候一定要注意大小写的区别。 |
|