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

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

PHP將部分內容替換成星號

添加時間:2014-11-30 21:39:37  添加: 思海網絡 
在最近的項目中,會碰到到某人的手機號碼隱藏中間幾位,身份證號碼只顯示末尾4位的需求。當時一開始是網上搜索了一下,看到有人是用substr_replace這個函數來替換的,后面我也用了這個函數,但在用的時候不是很好用。
 
一、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的時候,就變成插入了,而不是替換,額。。。
 
 
 
用下來,我是感覺不是很順手,雖然說滿足我現在的需求還是可以的,但是如果將來需要一些擴展的話,耍起來挺吃力的,所以就想到自己構造一個,將來用起來也方便。
 
 
 
二、自制的星號替換函數
 
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_replace
replaceStar
start為正數,長度為負數
 
 
 
start為負數,長度為負數
 
 
 
 
 start為正數,長度為0 做插入操作
 start為負數,長度為0 做插入操作
三、源碼分享
 
復制代碼
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) {//當開始的下標大于字符串長度的時候,就不做替換了
                    $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++;
        }
 
        return substr_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做替換
 
 
 
四、單元測試
 
復制代碼
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');
    }
關鍵字:PHP、替換
分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站