PHP正则表达式实现手机号清洗:仅保留开头的+(若字符串以+开头)并移除非数字字符
嘿,我来帮你搞定这个手机号清洗的需求!刚好可以用一个正则表达式一步完成,不用分两次调用或者写if判断,完美符合你的要求。
核心解决方案
直接用下面的preg_replace代码就能搞定所有规则:
$input = "+49+12423#23492@aosd#+dasd"; $cleanedPhone = preg_replace('/\A\+\K|[^\d+]|(?<!\A)\+/', '', $input); // 输出结果:+491242323492
如果输入是不以+开头的字符串,比如49+12423#23492@aosd#+dasd,会输出491242323492,完全符合预期。
正则表达式拆解
我把这个正则拆成三个部分,你一看就懂:
\A\+\K:专门匹配字符串开头的那个+,\K的作用是告诉正则“忽略前面匹配到的内容”,也就是保留这个开头的+不被替换[^\d+]:匹配所有非数字、非+的字符(比如#、@、字母这些),直接替换为空(?<!\A)\+:匹配所有不在字符串开头的+,也就是除了第一个开头的+之外,其他所有+都替换为空
这三个部分用|连接,意味着只要匹配到其中任意一种情况,就会被替换成空字符串,刚好一次性完成所有清洗操作。
边界情况测试
再给你几个边界场景的测试结果,确保覆盖所有情况:
- 输入
++++→ 输出+(只保留开头第一个+) - 输入
a+123+b45→ 输出12345(无开头+,所有+和非数字都移除) - 输入
+12a3+4#5→ 输出+12345(保留开头+,移除其他+和非数字)
内容的提问来源于stack exchange,提问作者1de
相关产品推荐
相关产品推荐

