1. 程式人生 > >php實現隱藏字符串的功能

php實現隱藏字符串的功能

字符 ajax http flv loaded span 準備 用戶配置 別人

  好久沒有認真寫自己的博客了,之前的隨筆都是自己寫的一部分再復制別人的代碼的。因為深知自己的水平還是菜鳥級別,寫不出來高質量的博客。所以自己之前寫的博客都沒有公開,但是萬事開頭難嘛,今天鼓起勇氣去走這一步。工作中有個需求,就是用“*”號隱藏字符串的內容,今天準備用隨筆的形式記錄一下具體是怎麽完成這個功能的。

(這裏是用戶的需求:技術分享圖片

那麽我們實現的過程大致主要分為以下三個步驟:

   1:實現一個界面讓用戶針對某個字段的值自定義隱藏的位置以及每個位置的長度。

   2:將用戶配置的值用分隔符保存成字符串的形式保存到數據庫中。

3:將用戶設定的字段的值實現具體的隱藏效果。

(註:以下具體實現的內容根據我們公司的項目為例)

一、 實現一個界面讓用戶針對某個字段的值自定義隱藏的位置以及每個位置的長度。

  ①在布局設計中,用戶在當前字段點擊編輯字段隱藏時,創建一個div。具體效果如下。(這個太簡單,具體實現過程忽略)

技術分享圖片

二、將用戶配置的值用分隔符保存成字符串的形式保存到數據庫中。

 當用戶設置好後點擊保存時,js驗證用戶設置的值是否合理。如:全部為空。驗證通過後通過ajax保存到數據庫。以上圖為例,我保存在表中的字符串形式是encryptflv:show_.show_.hide_4,(具體實現過程忽略)

三、將用戶設定的字段的值實現具體的隱藏效果。

這是整個功能中重要的一步。

①首先是把字符串取出來,再切割為數組。

②將數組按執行隱藏的優先級進行排序

技術分享圖片

我們假如用戶是按如上的步驟設置的,中間沒有設置值,那麽字符串隱藏的位置就是從第四個開始到倒數第四個結束。如 135******8977。

所以要對整個數組進行排序,從頭到尾先執行填寫了長度的顯示/隱藏操作,再執行沒有填寫字符串的長度。

所以這裏就需要為這個數組進行排序,我的思路是如果設置了長度,就給定一個變量的值isnumber為1,沒有設置就為0。然後再按頭-->中->尾分別設置變量position的值為0,1,2。

這裏貼上代碼:

foreach ($encryptflv as $k => $v) {
            list($type, $value) = explode(‘_‘, $v);
            if (!$value) {
                $isnumber = ‘0‘;
                $value = ‘?‘;
            } else {
                $isnumber = ‘1‘;
            }
            $encrtpyflvarr[] = array(‘length‘ => $value, ‘isnumber‘ => $isnumber, ‘position‘ => $k, ‘method‘ => $type);
            unset($k);unset($v);
        }

然後對這個多維數組$encrtpyflvarr先安裝isnumber降序,再安裝postion升序。所以這裏我們需要實現一個多維數組排序的方法:

//多維不固定參數的數組排序。
function sortArrByManyField(){
    //將函數的所有參數轉化為一個數組
    $args = func_get_args();
    if(empty($args)){
        return null;
    }
    //刪除$args的第一個元素並賦值給$arr
    $arr = array_shift($args);
    if(!is_array($arr)){
        throw new Exception("第一個參數不為數組");
    }
    foreach($args as $key => $field){
        if(is_string($field)){
            $temp = array();
            foreach($arr as $index=> $val){
                $temp[$index] = $val[$field];
            }
            $args[$key] = $temp;
        }
    }
    $args[] = &$arr;//引用值
    //調用回調函數array_multisort 並將$arhs作為回調函數的參數傳入
    call_user_func_array(‘array_multisort‘,$args);
    return array_pop($args);
}

調用:

//給設置的隱藏顯示字數的操作轉換為數組的形式,並且按照先後順序進行排序。
        $encrtpyflvarr = sortArrByManyField($encrtpyflvarr, ‘isnumber‘, SORT_DESC, ‘position‘, SORT_ASC);

③遍歷這個按照多個參數排序後的多維數組,根據數組裏面的長度、位置進行具體的‘*’號替換,由於代碼寫的比較亂(爛),這裏我就不貼上來了。替換有一個函數substr_replace,但是因為我們替換的字符串有中文,那麽這個函數顯然不行;所以這裏自己實現了一個可以替換中文字符串的函數:

function mb_substr_replace($string, $replacement, $start, $length = null, $encoding = null)
{
    if (extension_loaded(‘mbstring‘) === true) {
        $string_length = (is_null($encoding) === true) ? mb_strlen($string) : mb_strlen($string, $encoding);
        if ($start < 0) {
            $start = max(0, $string_length + $start);
        } else if ($start > $string_length) {
            $start = $string_length;
        }
        if ($length < 0) {
            $length = max(0, $string_length - $start + $length);
        } else if ((is_null($length) === true) || ($length > $string_length)) {
            $length = $string_length;
        }
        if (($start + $length) > $string_length) {
            $length = $string_length - $start;
        }

        if (is_null($encoding) === true) {
            return mb_substr($string, 0, $start) . $replacement . mb_substr($string, $start + $length, $string_length - $start - $length);
        }
        return mb_substr($string, 0, $start, $encoding) . $replacement . mb_substr($string, $start + $length, $string_length - $start - $length, $encoding);
    }
    return (is_null($length) === true) ? substr_replace($string, $replacement, $start) : substr_replace($string, $replacement, $start, $length);
}

前4個參數我就不一一介紹了,第五個參數填寫編碼格式,這裏建議提utf_8。我們輸入參數直接調用就可以實現我們需要的功能啦!!!

  總結:整個功能其實很簡單,這個博客可能對於其他人來說沒有什麽意義。但是因為自己還是個菜鳥,主要還是為了自己記錄一下吧。後面具體替換的時候還遇到個問題,<a>了開發考了多</a>。只需要替換a標簽中的值,那我們用了正則匹配才完成功能。

php實現隱藏字符串的功能