亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來(lái)到思海網(wǎng)絡(luò),我們將竭誠(chéng)為您提供優(yōu)質(zhì)的服務(wù)! 誠(chéng)征網(wǎng)絡(luò)推廣 | 網(wǎng)站備案 | 幫助中心 | 軟件下載 | 購(gòu)買(mǎi)流程 | 付款方式 | 聯(lián)系我們 [ 會(huì)員登錄/注冊(cè) ]
促銷(xiāo)推廣
客服中心
業(yè)務(wù)咨詢
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352289
點(diǎn)擊這里給我發(fā)消息  81721488
有事點(diǎn)擊這里…  376585780
有事點(diǎn)擊這里…  872642803
有事點(diǎn)擊這里…  459248018
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  380791050
技術(shù)支持
有事點(diǎn)擊這里…  714236853
有事點(diǎn)擊這里…  719304487
有事點(diǎn)擊這里…  1208894568
有事點(diǎn)擊這里…  61352289
在線客服
有事點(diǎn)擊這里…  531199185
有事點(diǎn)擊這里…  61352288
有事點(diǎn)擊這里…  983054746
有事點(diǎn)擊這里…  893984210
當(dāng)前位置:首頁(yè) >> 技術(shù)文章 >> 文章瀏覽
技術(shù)文章

PHP將部分內(nèi)容替換成星號(hào)

添加時(shí)間:2014-11-30 21:39:37  添加: 思海網(wǎng)絡(luò) 
在最近的項(xiàng)目中,會(huì)碰到到某人的手機(jī)號(hào)碼隱藏中間幾位,身份證號(hào)碼只顯示末尾4位的需求。當(dāng)時(shí)一開(kāi)始是網(wǎng)上搜索了一下,看到有人是用substr_replace這個(gè)函數(shù)來(lái)替換的,后面我也用了這個(gè)函數(shù),但在用的時(shí)候不是很好用。
 
一、substr_replace
 
先來(lái)看看這個(gè)函數(shù)的語(yǔ)法:
 
substr_replace(string,replacement,start,length)
參數(shù) 描述
string 必需。規(guī)定要檢查的字符串。
replacement 必需。規(guī)定要插入的字符串。
start
必需。規(guī)定在字符串的何處開(kāi)始替換。
 
  正數(shù) - 在第 start 個(gè)偏移量開(kāi)始替換
 
  負(fù)數(shù) - 在從字符串結(jié)尾的第 start 個(gè)偏移量開(kāi)始替換
 
  0 - 在字符串中的第一個(gè)字符處開(kāi)始替換
 
charlist
可選。規(guī)定要替換多少個(gè)字符。
 
  正數(shù) - 被替換的字符串長(zhǎng)度
 
  負(fù)數(shù) - 從字符串末端開(kāi)始的被替換字符數(shù)
 
  0 - 插入而非替換
 
1、當(dāng)start與charlist都為正數(shù)的時(shí)候,非常好理解,也很符號(hào)人的邏輯,start是從0開(kāi)始的,如下圖,根據(jù)條件,綠色的將是要被替換的元素
 
 
 
2、當(dāng)start為負(fù)數(shù),charlist為正數(shù)的時(shí)候,也挺好理解的
 
 
 
3、當(dāng)start為正數(shù),charlist為負(fù)數(shù)的時(shí)候,這個(gè)我一開(kāi)始理解錯(cuò)了
 
 
 
4、當(dāng)start為負(fù)數(shù),charlist為負(fù)數(shù)的時(shí)候,有一個(gè)地方需要注意的就是:如果 start 是負(fù)數(shù)且 length 小于等于 start,則 length 為 0。這個(gè)坑挺容易踩到的
 
 
 
5、charlist為0的時(shí)候,就變成插入了,而不是替換,額。。。
 
 
 
用下來(lái),我是感覺(jué)不是很順手,雖然說(shuō)滿足我現(xiàn)在的需求還是可以的,但是如果將來(lái)需要一些擴(kuò)展的話,耍起來(lái)挺吃力的,所以就想到自己構(gòu)造一個(gè),將來(lái)用起來(lái)也方便。
 
 
 
二、自制的星號(hào)替換函數(shù)
 
replaceStar($str, $start, $length = 0)
參數(shù) 描述
str 必需。規(guī)定要檢查的字符串。
start
必需。規(guī)定在字符串的何處開(kāi)始替換。
 
  正數(shù) - 在第 start 個(gè)偏移量開(kāi)始替換
 
  負(fù)數(shù) - 在從字符串結(jié)尾的第 start 個(gè)偏移量開(kāi)始替換
 
  0 - 在字符串中的第一個(gè)字符處開(kāi)始替換
 
length
可選。規(guī)定要替換多少個(gè)字符。
 
  正數(shù) - 被替換的字符串長(zhǎng)度,從左往右
 
  負(fù)數(shù) - 被替換的字符串長(zhǎng)度,從右往左
 
  0 - 如果start為正數(shù),從start開(kāi)始向左到最后
 
     - 如果start為負(fù)數(shù),從start開(kāi)始向右到最后
 
前面的兩個(gè)參數(shù)與上面的一樣,最后的參數(shù)與上面不同
 
1、當(dāng)start與length都為正數(shù),與substr_replace表現(xiàn)的一樣
 
2、當(dāng)start為負(fù)數(shù),length為正數(shù),與substr_replace表現(xiàn)的一樣
 
 
substr_replace
replaceStar
start為正數(shù),長(zhǎng)度為負(fù)數(shù)
 
 
 
start為負(fù)數(shù),長(zhǎng)度為負(fù)數(shù)
 
 
 
 
 start為正數(shù),長(zhǎng)度為0 做插入操作
 start為負(fù)數(shù),長(zhǎng)度為0 做插入操作
三、源碼分享
 
復(fù)制代碼
public static function replaceStar($str, $start, $length = 0)
{
        $i = 0;
        $star = '';
        if($start >= 0) {
            if($length > 0) {
                $str_len = strlen($str);
                $count = $length;
                if($start >= $str_len) {//當(dāng)開(kāi)始的下標(biāo)大于字符串長(zhǎng)度的時(shí)候,就不做替換了
                    $count = 0;
                }
            }elseif($length < 0){
                $str_len = strlen($str);
                $count = abs($length);
                if($start >= $str_len) {//當(dāng)開(kāi)始的下標(biāo)大于字符串長(zhǎng)度的時(shí)候,由于是反向的,就從最后那個(gè)字符的下標(biāo)開(kāi)始
                    $start = $str_len - 1;
                }
                $offset = $start - $count + 1;//起點(diǎn)下標(biāo)減去數(shù)量,計(jì)算偏移量
                $count = $offset >= 0 ? abs($length) : ($start + 1);//偏移量大于等于0說(shuō)明沒(méi)有超過(guò)最左邊,小于0了說(shuō)明超過(guò)了最左邊,就用起點(diǎn)到最左邊的長(zhǎng)度
                $start = $offset >= 0 ? $offset : 0;//從最左邊或左邊的某個(gè)位置開(kāi)始
            }else {
                $str_len = strlen($str);
                $count = $str_len - $start;//計(jì)算要替換的數(shù)量
            }
        }else {
            if($length > 0) {
                $offset = abs($start);
                $count = $offset >= $length ? $length : $offset;//大于等于長(zhǎng)度的時(shí)候 沒(méi)有超出最右邊
            }elseif($length < 0){
                $str_len = strlen($str);
                $end = $str_len + $start;//計(jì)算偏移的結(jié)尾值
                $offset = abs($start + $length) - 1;//計(jì)算偏移量,由于都是負(fù)數(shù)就加起來(lái)
                $start = $str_len - $offset;//計(jì)算起點(diǎn)值
                $start = $start >= 0 ? $start : 0;
                $count = $end - $start + 1;
            }else {
                $str_len = strlen($str);
                $count = $str_len + $start + 1;//計(jì)算需要偏移的長(zhǎng)度
                $start = 0;
            }
        }
 
        while ($i < $count) {
            $star .= '*';
            $i++;
        }
 
        return substr_replace($str, $star, $start, $count);
}
復(fù)制代碼
不擅長(zhǎng)算法,這里就用很普通的邏輯來(lái)展示啦,沒(méi)有用到啥數(shù)學(xué)公式。
 
1、if($start >= 0)這里做start大于等于0與小于0的分支
 
2、在start 的分之中,分別再做length 大于0,小于0和等于0的三個(gè)分支
 
3、最后計(jì)算出start、count和要替換的星號(hào)字符串,最后計(jì)算出的start與count都是正數(shù),運(yùn)用substr_replace做替換
 
 
 
四、單元測(cè)試
 
復(fù)制代碼
public function testReplaceStar()
    {
        $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');
    }
關(guān)鍵字:PHP、替換
分享到:

頂部 】 【 關(guān)閉
版權(quán)所有:佛山思海電腦網(wǎng)絡(luò)有限公司 ©1998-2024 All Rights Reserved.
聯(lián)系電話:(0757)22630313、22633833
中華人民共和國(guó)增值電信業(yè)務(wù)經(jīng)營(yíng)許可證: 粵B1.B2-20030321 備案號(hào):粵B2-20030321-1
網(wǎng)站公安備案編號(hào):44060602000007 交互式欄目專(zhuān)項(xiàng)備案編號(hào):200303DD003  
察察 工商 網(wǎng)安 舉報(bào)有獎(jiǎng)  警警  手機(jī)打開(kāi)網(wǎng)站