PHP网页编程之PHP将部份内容交换成星号
模仿的不光是模仿,模仿的同时在加改进,就成了自己的作品了。在比来的项目中,会碰着到或人的手机号码埋没两头几位,身份证号码只显现开端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对字母的大小写是敏感的,写的时候一定要注意大小写的区别。 当然这种网站的会员费就几十块钱。 最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。 说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。 在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。 php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。 php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
页:
[1]