V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fim8
V2EX  ›  程序员

PHP提问:我想把获得的数据中间四位数变星星,该怎么办?

  •  
  •   fim8 · 2011-03-27 15:17:32 +08:00 · 5928 次点击
    这是一个创建于 4999 天前的主题,其中的信息可能已经有所发展或是发生改变。
    上传一个文本,里面都是手机号,需要批量写入数据库中,

    循环操作时候是这样的:

    foreach($str_arr as $key => $value){

    $mobile_phone = $value; ......省略其他



    现在我想把$value也就是手机号数据中间的四位通过什么方法加星。

    例如15855558888变成158****8888

    然后再录入数据库。有什么好的方法吗?谢谢大家:)
    22 条回复    1970-01-01 08:00:00 +08:00
    TheOnly92
        1
    TheOnly92  
       2011-03-27 15:18:45 +08:00
    用 preg_replace,#^([0-9]+){3}.*([0-9]+){4}$# replace into $1****$2

    应该吧。。。
    fim8
        2
    fim8  
    OP
       2011-03-27 15:20:24 +08:00
    @TheOnly92 这是正则吗?是不是得写成一个函数,然后把$value包含进去?
    TheOnly92
        3
    TheOnly92  
       2011-03-27 15:21:43 +08:00
    是正则,代码如下:

    preg_replace('#^([0-9]{3}).*([0-9]{4})$#','$1****$2',$value)

    刚才正则有点错误,现在修正了。
    fim8
        4
    fim8  
    OP
       2011-03-27 15:22:43 +08:00
    @TheOnly92 好的,我试试,太感谢了。回复的真迅速= =
    TheOnly92
        5
    TheOnly92  
       2011-03-27 15:24:24 +08:00
    嗯,刚刚没想到,原来还有比较“笨”的方法:

    $value = substr($value,0,3).'****'.substr($value,-4)
    icyflash
        6
    icyflash  
       2011-03-27 15:24:50 +08:00
    先split 再拼凑也行
    fim8
        7
    fim8  
    OP
       2011-03-27 15:30:06 +08:00
    @TheOnly92 成功了,非常感谢,得好好学学正则了。
    '#^([0-9]{3}).*([0-9]{4})$#','$1****$2'
    这句话的大概意思就是,把$value先取前三个数字,再取最后四个数字,其他的用****填充对吧。
    就是#^ .* $# 这三个比较不理解。
    总之非常感谢!
    fim8
        8
    fim8  
    OP
       2011-03-27 15:31:09 +08:00
    @TheOnly92 这个是用PHP函数弄的吧,很神奇。。虚心学习了:)再次感谢。
    TheOnly92
        9
    TheOnly92  
       2011-03-27 15:35:55 +08:00
    # 是正则中的定界符,^ 和 $ 分别表示句首和句尾,而 .* 则是任何东西。
    TheOnly92
        10
    TheOnly92  
       2011-03-27 15:36:44 +08:00
    补充:正则中的定界符可以利用任何符号,除了正则中已经有意义的符号。
    chloerei
        11
    chloerei  
       2011-03-27 15:37:24 +08:00
    =.= 是我就直接字符串拼接了……
    sospartan
        12
    sospartan  
       2011-03-27 15:38:01 +08:00
    @fim8 正则还是非常有用的 google一下
    kayue
        13
    kayue  
       2011-03-27 22:32:33 +08:00
    substr is a better way.
    vayn
        14
    vayn  
       2011-03-27 22:42:34 +08:00
    @kayue substr_replace is more convenient than substr in this scenario XD
    darasion
        15
    darasion  
       2011-03-27 22:46:30 +08:00
    保存的时候加星会把这个字段完全变成垃圾数据。

    最好还是显示的时候加星吧。
    jeeson
        16
    jeeson  
       2011-03-27 22:50:03 +08:00
    这种情况下, 正则表达式实在大材小用了

    正则表达式要先"编译", 然后再在字符串上"匹配" + "应用", 就这个问题而言, 性能可能会差10倍以上

    #5 "最笨"的反而是最好的方法
    kayue
        17
    kayue  
       2011-03-27 22:53:03 +08:00
    @jeeson +1
    vayn
        18
    vayn  
       2011-03-27 23:01:59 +08:00
    @darasion 赞同,如果数据库里直接存处理过的号码不如不存算了……

    $a = '15855558888';
    substr_replace($a, '****', 3, 4);
    yokle
        19
    yokle  
       2011-05-04 11:23:00 +08:00
    手机号码 字符规定的。 还不如用分割再拼凑的方面。 简单方便
    kojp
        20
    kojp  
       2011-05-04 11:58:37 +08:00
    V2EX 好人真多~~~~~
    predator
        21
    predator  
       2011-05-04 17:56:52 +08:00
    UPDATE table_name SET mobile_field_name = CONCAT(LEFT(mobile_field_name, 3), '****', RIGHT(mobile_field_name, 4));
    chuck911
        22
    chuck911  
       2011-05-04 18:03:42 +08:00
    @predator 哈哈,这样真正的号码再也找不回来了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1045 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:19 · PVG 04:19 · LAX 12:19 · JFK 15:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.