You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:07:37