使用PHP实现隐藏字符串指定位置字符串

jerry 2015年11月18日 收藏
实现字符串部分字符用*代替的功能
在很多安全性较高的网站中,经常会看到银行账号只显示前几位和后几位,中间的都用*代替了,有些邮箱也有几个字符被*代替,有些用户账号、密码等字符串中也出现了用*替代其中几位的,其实在我们自己做项目的时候也会经常用到这种做法,实现起来很简单,但是每次都要写一遍也麻烦,于是我写了个函数调用即可。

支持的功能:

1、支持字符串从指定位置从左向右隐藏连续N个字符

2、支持字符串从指定位置从右向左隐藏连续N个字符

3、支持字符串指定字符前面从右向左隐藏连续N个字符,用于隐藏邮箱等

4、支持字符串指定字符后面面从左向右隐藏连续N个字符,用于隐藏邮箱等

5、支持只保留字符串首末指定长度外的字符串外的字符隐藏

6、支持中英文字符串

代码:
  1. /**
  2.   +----------------------------------------------------------
  3.  * 将一个字符串部分字符用*替代隐藏
  4.   +----------------------------------------------------------
  5.  * @param string    $string   待转换的字符串
  6.  * @param int       $bengin   起始位置,从0开始计数,当$type=4时,表示左侧保留长度
  7.  * @param int       $len      需要转换成*的字符个数,当$type=4时,表示右侧保留长度
  8.  * @param int       $type     转换类型:0,从左向右隐藏;1,从右向左隐藏;2,从指定字符位置分割前由右向左隐藏;3,从指定字符位置分割后由左向右隐藏;4,保留首末指定字符串
  9.  * @param string    $glue     分割符
  10.   +----------------------------------------------------------
  11.  * @return string   处理后的字符串
  12.   +----------------------------------------------------------
  13.  */
  14. function hideStr($string, $bengin=0, $len = 4, $type = 0, $glue = "@") {
  15.     if (empty($string))
  16.         return false;
  17.     $array = array();
  18.     if ($type == 0 || $type == 1 || $type == 4) {
  19.         $strlen = $length = mb_strlen($string);
  20.         while ($strlen) {
  21.             $array[] = mb_substr($string, 0, 1, "utf8");
  22.             $string = mb_substr($string, 1, $strlen, "utf8");
  23.             $strlen = mb_strlen($string);
  24.         }
  25.     }
  26.     if ($type == 0) {
  27.         for ($i = $bengin; $i < ($bengin + $len); $i++) {
  28.             if (isset($array[$i]))
  29.                 $array[$i] = "*";
  30.         }
  31.         $string = implode("", $array);
  32.     }else if ($type == 1) {
  33.         $array = array_reverse($array);
  34.         for ($i = $bengin; $i < ($bengin + $len); $i++) {
  35.             if (isset($array[$i]))
  36.                 $array[$i] = "*";
  37.         }
  38.         $string = implode("", array_reverse($array));
  39.     }else if ($type == 2) {
  40.         $array = explode($glue, $string);
  41.         $array[0] = hideStr($array[0], $bengin, $len, 1);
  42.         $string = implode($glue, $array);
  43.     } else if ($type == 3) {
  44.         $array = explode($glue, $string);
  45.         $array[1] = hideStr($array[1], $bengin, $len, 0);
  46.         $string = implode($glue, $array);
  47.     } else if ($type == 4) {
  48.         $left = $bengin;
  49.         $right = $len;
  50.         $tem = array();
  51.         for ($i = 0; $i < ($length - $right); $i++) {
  52.             if (isset($array[$i]))
  53.                 $tem[] = $i >= $left ? "*" : $array[$i];
  54.         }
  55.         $array = array_chunk(array_reverse($array), $right);
  56.         $array = array_reverse($array[0]);
  57.         for ($i = 0; $i < $right; $i++) {
  58.             $tem[] = $array[$i];
  59.         }
  60.         $string = implode("", $tem);
  61.     }
  62.     return $string;
  63. }
用法示例:
  1. $str0 = "abcd一二三四五六七八九十";
  2. $str2 = "hengqin2008@qq.com";
  3. $str3 = "hengqin2008@yahoo.com.cn";
  4. $str4 = "0123456789";
  5. echo "原始字符串:$str0";
  6. echo "<br/>从左边第5个字符向右隐藏4个字符:" . hideStr($str0, 4, 4);
  7. echo "<br/>===========================================================";
  8. echo "<br/>原始字符串:$str0";
  9. echo "<br/>从右边第5个字符向左隐藏4个字符:" . hideStr($str0, 4, 4, 1);
  10. echo "<br/>===========================================================";
  11. echo "<br/>原始字符串:$str2";
  12. echo "<br/>隐藏指定字符@(或其他字符)前面的从右边第1个字符向左隐藏4个字符:" . hideStr($str2, 0, 4, 2);
  13. echo "<br/>===========================================================";
  14. echo "<br/>原始字符串:$str3";
  15. echo "<br/>隐藏指定字符@(或其他字符)后面的从左边第1个字符向右隐藏4个字符:" . hideStr($str3, 0, 4, 3);
  16. echo "<br/>===========================================================";
  17. echo "<br/>原始字符串:$str4";
  18. echo "<br/>隐藏首保留3个字符,右保留2个字符:" . hideStr($str4, 3, 2, 4);
运行后的效果:

我的blog对应日志地址:http://blog.51edm.org/post/107