具有特定区号和格式的电话号码的正则表达式


Regex for phone number with specific area code and format

我正在尝试创建一个正则表达式,该表达式将使用 868 区号和特定格式验证特定电话号码h因此我想要这些

8680000000
(868) 000 0000
868-000-0000
868 000-0000

通过验证,但这些

8880000000
767-000-0000
868-0000000
(868)0000000

以失败验证。

到目前为止,我得到了:

^(('(){0,1}(868){1}(')){0,1})+:?((((' |'-)('d{3})(' |'-)):?'d{4})+|('d{4,7}))

(868)0000000 

正在验证

我真的不明白为什么每个人都需要验证具有严格间距、括号、连字和天知道还有什么要求的电话号码。

去除所有不必要的字符,验证需要验证的内容,继续生活。

$phone = '(868) 555-1234'; // or 868 555.1234 or +868x55-5-123-4 etc
$phone = preg_replace('/[^0-9]/', '', $phone); // 8685551234
if( substring($phone, 0, 3) == '868' ) {
  // great success
}

奖金回合。格式化胡人显示的数据:

$phone_display = sprintf('(%s) %s-%s',
  substring($phone,0,3),
  substring($phone,3,3),
  substring($phone,6,4));
实际上这

有点硬编码,因为您有一些特定的要求,例如验证868-000-0000但不868-0000000

正则表达式是:

(^'(868')' 'd{3}' 'd{4})|(^868'd{7})|(^868'-'d{3}'-'d{4})|(^868' 'd{3}'-'d{4})

演示

这样的正则表达式

^('(?868')?('s*|-)'d{3}('s|-)'d{4}|868'd{7})$

验证这些

8680000000
(868) 000 0000
868-000-0000
868 000-0000

未验证

8880000000
767-000-0000
868-0000000
(868)0000000

match[1]包含数字

正则表达式的演示和解释

您可以编写一个匹配所有格式的正则表达式,但没有规则规定您必须这样做。

单独匹配每种格式会使您的代码更具可读性:

function matchPhoneNumber($phoneNumber) {
    $regex = [
        '/^(?P<prefix>868)(?P<first>'d{3})(?P<second>'d{4})$/',
        '/^(?P<prefix>868)-(?P<first>'d{3})-(?P<second>'d{4})$/',
        '/^(?P<prefix>868)'s(?P<first>'d{3})-(?P<second>'d{4})$/',
        '/^'((?P<prefix>868)')'s(?P<first>'d{3})'s(?P<second>'d{4})$/',
    ];
    foreach ($regex as $reg) {
        if (preg_match($reg, $phoneNumber, $match) === 1) {
            return $match;
        }
    }
    return false;
}

您可以使用一些条件来执行此操作

 # ^('()?868(?(1)')[ ]'d{3}[ ]'d{4}|(?:(?:(-)|([ ])|)'d{3}(?(2)'2|(?(3)[ -]))'d{4}))$
 ^                             # BOS
 ( '( )?                       # (1), Form (xxx) xxx xxxx
 868                           # 868 Area Code
 (?(1)                         # Need Form 1 ?
      ')
      [ ] 'd{3} [ ] 'd{4} 
   |                              # else
      (?:
           (?:
                ( - )                         # (2), Form xxx-xxx-xxxx
             |  ( [ ] )                       # (3), Form xxx xxx[ -]xxxx
             |                              # Form xxxxxxxxxx
           )
           'd{3}      
           (?(2)                         # Need form 2 ?
                '2 
             |                              # else
                (?(3) [ -] )                  # Need form 3 ?
           )
           'd{4}      
      )
 )
 $                             # EOS

通过:

8680000000
(868) 000 0000
868-000-0000
868 000-0000

失败:

8880000000
767-000-0000
868-0000000
(868)0000000

假设PHP像awkgrep -E那样使用ERA:

$ grep -E '^((868([0-9]{3}|[- ][0-9]{3}-))|('(868') [0-9]{3} ))[0-9]{4}$' file
8680000000
(868) 000 0000
868-000-0000
868 000-0000

或者如果你喜欢'd而不是[0-9]

^((868('d{3}|[- ]'d{3}-))|('(868') 'd{3} ))'d{4}$

任何简短的内容都会匹配您未指定为有效的其他电话号码格式,因此我假设这些格式无效。