4

我有这个功能来检查我的电话号码:

function isValid( $what, $data ) {

        switch( $what ) {

                // validate a phone number
                case 'phone_number':
                        $pattern = "/^[0-9-+]+$/";

                break;



                default:
                        return false;
                break;

        }
        return preg_match($pattern, $data) ? true : false;
}

我想更改该正则表达式以接受以下内容:) ((800) 和space.

因此,例如这个数字将通过验证,现在没有通过:

+1 (201) 223-3213

4

4 回答 4

8

让我们一步一步地构造正则表达式。还要考虑在匹配之前修剪空格。

  • 一开始可能有也可能没有+号。这也需要逃避。\+?
  • 然后是一个或多个数字,在带括号的部分之前如果数字可以直接以括号中的组开头,[0-9]+您可能想写[0-9]*
  • 然后,可选地在括号中出现一组数字:(\[0-9]+\)?. 假设只允许一个这样的组
  • 然后是本地电话号码,也允许使用连字符:[0-9-]*
  • 最后一个字符必须是数字[0-9],此处不允许使用连字符

    ^\+?[0-9]+(\([0-9]+\))?[0-9-]*[0-9]$
    

在这里查看结果。修剪空格看起来像$trimmed = str_replace(' ', '', $pattern);.

于 2012-08-23T09:03:42.330 回答
4

这个正则表达式怎么样:

/^[0-9-+()\s]+$/

在此处查看实际操作

于 2012-08-23T08:43:42.247 回答
1
'/\(?\b[0-9]{3}\)?[-. ]?[0-9]{3,5}[-. ]?[0-9]{4,8}\b/'
于 2012-08-23T08:52:48.513 回答
1

由于您似乎正在使用它进行验证,您可以使用它str_replace('[\s\+\-\(\)]', '', $data)来获取一个应该(如果电话号码有效)只包含数字的字符串。然后,您可以通过运行轻松测试此假设preg_match('\d{11}', $data){11}表示 11 位数字,如果允许范围,请使用 min, max 像这样{min,max},例如\d{10,11})。

值得注意的是,这不像 Lorlin 的回答那样彻底,因为您忽略了括号+s 或-s 的任何无效使用。您可能想使用两者的组合,或者最适合您需要的任何东西。

于 2012-08-23T10:39:11.693 回答