• 请不要在回答技术问题时复制粘贴 AI 生成的内容
heckthisplace
V2EX  ›  程序员

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

  •  
  •   heckthisplace · Mar 27, 2011 · 7077 views
    This topic created in 5703 days ago, the information mentioned may be changed or developed.
    上传一个文本,里面都是手机号,需要批量写入数据库中,

    循环操作时候是这样的:

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

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



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

    例如15855558888变成158****8888

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

    应该吧。。。
    heckthisplace
    heckthisplace
    OP
    Mar 27, 2011
    2
    @TheOnly92 这是正则吗?是不是得写成一个函数,然后把$value包含进去?
    TheOnly92
    TheOnly92
    Mar 27, 2011
    3
    是正则,代码如下:

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

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

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

    最好还是显示的时候加星吧。
    jeeson
    jeeson
    Mar 27, 2011
    16
    这种情况下, 正则表达式实在大材小用了

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

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

    $a = '15855558888';
    substr_replace($a, '****', 3, 4);
    yokle
    yokle
    May 4, 2011
    19
    手机号码 字符规定的。 还不如用分割再拼凑的方面。 简单方便
    kojp
    kojp
    May 4, 2011
    20
    V2EX 好人真多~~~~~
    predator
    predator
    May 4, 2011
    21
    UPDATE table_name SET mobile_field_name = CONCAT(LEFT(mobile_field_name, 3), '****', RIGHT(mobile_field_name, 4));
    chuck911
    chuck911
    May 4, 2011
    22
    @predator 哈哈,这样真正的号码再也找不回来了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1919 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 01:21 · PVG 09:21 · LAX 17:21 · JFK 20:21
    ♥ Do have faith in what you're doing.