新加坡手机号正则验证函数开发求助(附问题代码)
修复新加坡手机号正则校验的问题
我看到你在给Gravity Forms添加新加坡手机号格式校验时遇到了问题,主要是正则表达式的写法有误。咱们一步步来修正:
原代码的核心问题
你把每个正则分支都用独立的/包裹并重复添加了D修饰符,这不符合PHP正则的语法规范——整个正则应该只在首尾有一对/分隔符,修饰符也只需要声明一次。另外,国家码部分的正则可以大幅简化,不用重复写三次+65开头的分支。
修正后的完整代码
add_filter( 'gform_phone_formats', 'sg_phone_format' ); function sg_phone_format( $phone_formats ) { $phone_formats['sg'] = array( 'label' => 'Singapore', 'mask' => false, // 合并正则分支,简化国家码逻辑 'regex' => '/^(?:[689]\d{7}|\+65[689]\d{7})$/D', ); return $phone_formats; }
正则表达式逻辑拆解
这个正则完全贴合你的需求:
^:锁定字符串开头,避免匹配内容前有多余字符(?:...):非捕获分组,用来把两个校验规则打包在一起[689]\d{7}:匹配本地格式:以6/8/9开头,后跟7位数字(比如61234567)|:逻辑或,允许匹配两个规则中的任意一种\+65[689]\d{7}:匹配国际格式:以+65(新加坡国家码)开头,紧跟6/8/9,再跟7位数字(比如+6587654321)
$:锁定字符串结尾,避免匹配内容后有多余字符/D修饰符:确保$只匹配字符串绝对末尾,不会误匹配换行符前的位置,彻底避免部分匹配的情况
修改后,不管用户输入本地格式还是带国家码的国际格式,都能正确完成校验了。
内容的提问来源于stack exchange,提问作者Wilson C
相关产品推荐
相关产品推荐

