php实现隐藏字符串的功能
好久沒有認(rèn)真寫自己的博客了,之前的隨筆都是自己寫的一部分再復(fù)制別人的代碼的。因?yàn)樯钪约旱乃竭€是菜鳥級別,寫不出來高質(zhì)量的博客。所以自己之前寫的博客都沒有公開,但是萬事開頭難嘛,今天鼓起勇氣去走這一步。工作中有個(gè)需求,就是用“*”號隱藏字符串的內(nèi)容,今天準(zhǔn)備用隨筆的形式記錄一下具體是怎么完成這個(gè)功能的。
(這里是用戶的需求:)
? ? ? 那么我們實(shí)現(xiàn)的過程大致主要分為以下三個(gè)步驟:
1:實(shí)現(xiàn)一個(gè)界面讓用戶針對某個(gè)字段的值自定義隱藏的位置以及每個(gè)位置的長度。
2:將用戶配置的值用分隔符保存成字符串的形式保存到數(shù)據(jù)庫中。
? ? ? ? 3:將用戶設(shè)定的字段的值實(shí)現(xiàn)具體的隱藏效果。
? ? ? ? (注:以下具體實(shí)現(xiàn)的內(nèi)容根據(jù)我們公司的項(xiàng)目為例)
?一、 實(shí)現(xiàn)一個(gè)界面讓用戶針對某個(gè)字段的值自定義隱藏的位置以及每個(gè)位置的長度。
①在布局設(shè)計(jì)中,用戶在當(dāng)前字段點(diǎn)擊編輯字段隱藏時(shí),創(chuàng)建一個(gè)div。具體效果如下。(這個(gè)太簡單,具體實(shí)現(xiàn)過程忽略)
? 二、將用戶配置的值用分隔符保存成字符串的形式保存到數(shù)據(jù)庫中。
當(dāng)用戶設(shè)置好后點(diǎn)擊保存時(shí),js驗(yàn)證用戶設(shè)置的值是否合理。如:全部為空。驗(yàn)證通過后通過ajax保存到數(shù)據(jù)庫。以上圖為例,我保存在表中的字符串形式是encryptflv:show_.show_.hide_4,(具體實(shí)現(xiàn)過程忽略)
?三、將用戶設(shè)定的字段的值實(shí)現(xiàn)具體的隱藏效果。
? ?這是整個(gè)功能中重要的一步。
? ?①首先是把字符串取出來,再切割為數(shù)組。
? ?②將數(shù)組按執(zhí)行隱藏的優(yōu)先級進(jìn)行排序
?
我們假如用戶是按如上的步驟設(shè)置的,中間沒有設(shè)置值,那么字符串隱藏的位置就是從第四個(gè)開始到倒數(shù)第四個(gè)結(jié)束。如 135******8977。
所以要對整個(gè)數(shù)組進(jìn)行排序,從頭到尾先執(zhí)行填寫了長度的顯示/隱藏操作,再執(zhí)行沒有填寫字符串的長度。
所以這里就需要為這個(gè)數(shù)組進(jìn)行排序,我的思路是如果設(shè)置了長度,就給定一個(gè)變量的值isnumber為1,沒有設(shè)置就為0。然后再按頭-->中->尾分別設(shè)置變量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);}然后對這個(gè)多維數(shù)組$encrtpyflvarr先安裝isnumber降序,再安裝postion升序。所以這里我們需要實(shí)現(xiàn)一個(gè)多維數(shù)組排序的方法:
//多維不固定參數(shù)的數(shù)組排序。 function sortArrByManyField(){//將函數(shù)的所有參數(shù)轉(zhuǎn)化為一個(gè)數(shù)組$args = func_get_args();if(empty($args)){return null;}//刪除$args的第一個(gè)元素并賦值給$arr$arr = array_shift($args);if(!is_array($arr)){throw new Exception("第一個(gè)參數(shù)不為數(shù)組");}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;//引用值//調(diào)用回調(diào)函數(shù)array_multisort 并將$arhs作為回調(diào)函數(shù)的參數(shù)傳入call_user_func_array('array_multisort',$args);return array_pop($args); }調(diào)用:
//給設(shè)置的隱藏顯示字?jǐn)?shù)的操作轉(zhuǎn)換為數(shù)組的形式,并且按照先后順序進(jìn)行排序。$encrtpyflvarr = sortArrByManyField($encrtpyflvarr, 'isnumber', SORT_DESC, 'position', SORT_ASC);③遍歷這個(gè)按照多個(gè)參數(shù)排序后的多維數(shù)組,根據(jù)數(shù)組里面的長度、位置進(jìn)行具體的‘*’號替換,由于代碼寫的比較亂(爛),這里我就不貼上來了。替換有一個(gè)函數(shù)substr_replace,但是因?yàn)槲覀兲鎿Q的字符串有中文,那么這個(gè)函數(shù)顯然不行;所以這里自己實(shí)現(xiàn)了一個(gè)可以替換中文字符串的函數(shù):
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個(gè)參數(shù)我就不一一介紹了,第五個(gè)參數(shù)填寫編碼格式,這里建議提utf_8。我們輸入?yún)?shù)直接調(diào)用就可以實(shí)現(xiàn)我們需要的功能啦!!!
? 總結(jié):整個(gè)功能其實(shí)很簡單,這個(gè)博客可能對于其他人來說沒有什么意義。但是因?yàn)樽约哼€是個(gè)菜鳥,主要還是為了自己記錄一下吧。后面具體替換的時(shí)候還遇到個(gè)問題,<a>了開發(fā)考了多</a>。只需要替換a標(biāo)簽中的值,那我們用了正則匹配才完成功能。
?
? ? ? ??
轉(zhuǎn)載于:https://www.cnblogs.com/wqyn/p/8568577.html
總結(jié)
以上是生活随笔為你收集整理的php实现隐藏字符串的功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wiki文档书写格式
- 下一篇: PHP的操作符与控制结构