PHP正则验证带+号的国际手机号并保留+号方案
PHP手机号正则验证(保留+号)解决方案
首先明确:你代码里的+号丢失不是正则的问题,是变量赋值时的语法错误导致的!
问题根源
你写的$str = +212600000000 ;没有给字符串加引号,PHP会把这个表达式当成数值字面量,开头的+会被当作正数符号直接忽略,所以变量$str里从一开始就没有+号,自然输出时看不到。
正确实现步骤
1. 修正变量赋值
字符串必须用单引号或双引号包裹,才能保留+号:
$str = "+212600000000"; // 若允许开头有空格,也可以写成: // $str = " +212600000000";
2. 优化正则表达式
你原来的正则/^[0-9 +-]+$/过于宽松,允许任意位置的+、-和空格,甚至多个+号,不符合手机号规则。根据你的需求(支持国家码+手机号格式,包含+、-、数字),推荐两种针对性正则:
情况1:允许开头一个+,中间可带-分隔(如+212-600000000)
/^\+?[0-9]+(?:-[0-9]+)*$/
- 规则解析:
^:匹配字符串开头\+?:可选的+号(若要求必须带国家码,去掉?即可)[0-9]+:至少一位数字(?:-[0-9]+)*:允许0或多个-+数字的组合(非捕获组,不占用匹配结果)$:匹配字符串结尾
情况2:严格匹配国家码+纯数字手机号(无-,如+212600000000)
如果不需要支持-分隔,用更严格的正则:
/^\+[0-9]{10,15}$/
- 规则解析:要求开头必须是
+,后面跟10-15位数字(符合国际手机号的常规长度范围)
3. 完整测试代码
纯数字带+号版本
<?php // 正确赋值,保留+号 $str = "+212600000000"; // 使用严格正则验证 if (preg_match('/^\+[0-9]{10,15}$/', $str)) { echo "Valid phone <br>"; echo $str; // 输出: // Valid phone // +212600000000 } else { echo "Not valid Phone"; } ?>
支持-分隔版本
<?php $str = "+44-7975-777666"; if (preg_match('/^\+?[0-9]+(?:-[0-9]+)*$/', $str)) { echo "Valid phone <br>"; echo $str; // 输出: // Valid phone // +44-7975-777666 } else { echo "Not valid Phone"; } ?>
内容的提问来源于stack exchange,提问作者AUB CHF
相关产品推荐
相关产品推荐

