一段话中手机号中间四位做特殊处理

来源:互联网 发布:湖北大学网络课程 编辑:程序博客网 时间:2024/06/06 04:00

最近接到了编辑这样的需求——『手机号做特殊处理,中间四位替换为*』并且给出了常见的联系方式:


Ø  正常联系方式
l   网上颇有知名度的当地导游王家乐(15274422092 ),QQ:(1453657757)
l   陈导(电话15974427155   QQ609137454 )
l   星期八客栈(电话:18674440396,订房qq:1291645848)
l   侯师傅,联系方式15547038013QQ546826424)

Ø  添加字符联系方式
l   郑师傅1-3-6-7-7-7-3-9-0-7-9,封师傅1-3-7-6-8-7-1-9-0-3-7
l   小伍吧(QQ852----713-------352)
l   小黎自助旅游qq422-678-881
l   陈真电话;⒈⒌⒉⒎⒋⒋⒐⒎⒊⒋二,QQ;2234  00124
l   推荐张家界清风自由行旅游网客服小朱(qq:2569-656860)
l   王师傅(联系电话:137-2203-4722)
l   出售188 6613 0199黑车交易市场

Ø  大写联系方式
l   郑师傅(壹叁陆柒柒柒叁玖零柒玖),封师傅(壹叁柒陆捌柒壹玖零叁柒)
l   电话:一五八六五四八三七一二
l   联系一三六八零零六七二三八

突然感叹最近的代码是不是太智能了……


本来是打算后端直接处理的,但是因为考虑到之后可能会出现需要用到用户联系方式的情况(比如我们可以倒买倒卖用户的联系方式嘛哈哈哈哈 当然是开玩笑),因此在前端展现的时候对电话号码进行处理——于是任务落在了我头上……


于是我就开始思考:

Ø  正常联系方式
l   正则匹配连续出现的数字,中间四位改为『****』
    regex_replace : "/(\d{3})\d{4}(\d{2,4})/" : "\$1****\$2"
    顺便对qq号也进行了处理,现存qq号主要为5-11位,为防止对日期20160811进行误判,从9位的qq号开始处理

Ø  添加字符联系方式
l   现有的主要就是在各数字后面添加『.-*+_ 』等符号进行分离,因此需要匹配这些符号0次或者多次(特殊符号列举不完,需要不停地迭代)
    regex_replace : "/((\d[\s~\·\`\!!@#\$¥%\^…&\*\((\))\-\_-——\+=\\、\{\}【】\[\]\/\??\.。\,,\<\>《》『』「」\"\'‘’“”]*){3})(\d[\s~\·\`\!!@#\$¥%\^…&\*\((\))\-\_-——\+=\\、\{\}【】\[\]\/\??\.。\,,\<\>《》『』「」\"\'‘’“”]*){4}((\d[\s~\·\`\!!@#\$¥%\^…&\*\((\))\-\_-——\+=\\、\{\}【】\[\]\/\??\.。\,,\<\>《》『』「」\"\'‘’“”]*){2,4})/" : "\$1****\$4"
    (我就问你有没有瞎注意这里分组是$4,给大家推荐一个正则的工具https://regexper.com,可以很清楚的看到正则的整个过程
    
Ø  大写联系方式
l   为了避免会误判到『一天』『两块石头』这样的字段,需要先判断一段话中是否有连续的大写文字,再替换成数字,然后同正常联系方式进行处理 

那么问题来了,因为所有数据都是通过同步数据打给前端的,所以


- 不能用js写,因为JS是在页面加载完之后才执行的,那个时候游记都已经展现了,还改个鬼啊……
- 不能用smarty语法写,因为不会……嘿嘿微笑

所以就只能写php了(php我也不会啊,但是可以抄啊)我一个前端居然开始写php了……其实也就是写了个方法,在smarty中调用就好了


首先是判断是否有多个连续的大写号码
一开始的正则是这么写的:$reg = "/[一二三四五六七八九零壹贰弎肆伍陆柒捌玖〇⒈⒉⒊⒋⒌⒎⒐]{9,11}/"
结果发现匹配出来是乱码然后开始考虑是字符编码的问题

中途踩了很多坑,基本可以参考这篇文章http://my.oschina.net/BearCatYN/blog/413833
一开始就单纯写的unicode编码,$reg = “/[\u58f9\u8d30\u5f0e\u8086\u4f0d\u9646\u67d2\u634c\u7396\u3007]{9,11}/"这样的,JS里面就是这样的嘛,结果发现根本没有匹配到

原来PHP正则表达式中不支持下列 Perl 转义序列:L, l, N, P, p, U, u, or X ,在 UTF-8 模式下,允许用“\x{...}”,花括号中的内容是表示十六进制数字的字符串,于是改成$reg = "/\x{58f9}\x{8d30}\x{53c1}\x{8086}\x{4f0d}\x{9646}\x{67d2}\x{634c}\x{7396}\x{3007}]{9,11}/“,还是不行……

于是加了一个修正符『u』,表示按unicode(utf-8)匹配(主要针对多字节比如汉字),$reg = "/[\x{58f9}\x{8d30}\x{53c1}\x{8086}\x{4f0d}\x{9646}\x{67d2}\x{634c}\x{7396}\x{3007}]{9,11}/u”,然后就好啦~好开心呢~

(对了,『三』的大写是『叁』不是『弎』……为什么我会弄错……委屈


在此附上找到的一些unicode,各种unicode 有的字符不知道怎么打出来的 待补


    1. 这是『一二三四五六七八九零』的unicode
        \x{4e00}\x{4e8c}\x{4e09}\x{56db}\x{4e94}\x{516d}\x{4e03}\x{516b}\x{4e5d}\x{96f6}


    2. 这是『壹贰叁肆伍陆柒捌玖〇』的unicode
        \x{58f9}\x{8d30}\x{53c1}\x{8086}\x{4f0d}\x{9646}\x{67d2}\x{634c}\x{7396}\x{3007}


    3. 这是『⒈⒉⒊⒋⒌⒍⒎⒏⒐』的unicode
        \x{2488}-\x{2490}


    4. 这是『①②③④⑤⑥⑦⑧⑨⓪』的unicode
        \x{2460}-\x{2468}\x{24ea}


    5. 这是『❶❷❸❹❺❻❼❽❾』的unicode
        \x{2776}-\x{277e}


    6. 这是『⑴⑵⑶⑷⑸⑹⑺⑻⑼』的unicode
        \x{2474}-\x{247c}


    7. 这是『㈠㈡㈣㈤㈥㈦㈧㈨』的unicode
        \x{3220}-\x{3228}


    8. 这是『㊀㊁㊂㊃㊄㊅㊆㊇㊈』的unicode
         \x{3280}-\x{3288}


感觉自己已经瞎了……


之后做一个替换的映射表,将匹配到的字符串进行替换,完成!


好啦,我要继续写代码了~


==========================================================================================================

20160924更新

以上主要涉及到两个函数preg_match_all和preg_match,这两个函数的区别可以参考http://blog.csdn.net/i1988/article/details/5830142这个文章,主要是匹配次数的问题,然后还要考虑好最后自己需要的是$match[0] 还是$match[1]的结果。 


然后现在又遇到这样的问题,就是……链接也被干掉了,比如图片(视频、链接什么的不好截图我就不发了,反正结果你们也能猜到),一查代码……

唉,现在就要做规避了……

细节太伤了,原谅我不想说……直接简单粗暴地上图吧,反正你们关心的也是这个(好像还是不能完全规避,唉 走一步看一步吧)


好了 我又要去写代码啦……(我们今天上班你们知道吗……

0 0
原创粉丝点击