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

Php 带有特定区号和格式的电话号码的正则表达式,php,regex,pcre,Php,Regex,Pcre,我试图创建一个正则表达式,用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{

我试图创建一个正则表达式,用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}))
但是


正在验证

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

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

$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
}
奖金回合。为hu man显示器设置数据格式:

$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
匹配[1]
包含数字


对正则表达式的解释可以通过一些条件来实现

 # ^(\()?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
通过:

868000000
(868)000 0000
868-000-0000
868000-0000

失败:

888000000
767-000-0000
868-0000000

(868)0000000

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

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

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;
}
函数匹配phoneNumber($phoneNumber){
$regex=[
“/^(?P868)(?P\d{3})(?P\d{4})$/”,
“/^(?P868)-(P\d{3})-(P\d{4})$/”,
“/^(?P868)\s(?P\d{3})-(P\d{4})$/”,
“/^\(?P868)\\s(?P\d{3})\s(?P\d{4})$/”,
];
foreach($regex as$reg){
if(preg_match($reg,$phoneNumber,$match)==1){
返回$match;
}
}
返回false;
}

假设PHP使用ERE,如
awk
grep-E
会:

$ 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}$

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

您需要否定字符类。虽然我同意,但听起来OP希望某些有效的电话号码格式失败,因此,此解决方案无法满足他们的需求报告
$8685551234
是否可以作为有效的电话号码?编写与您想要的文本匹配的代码总是很简单,但与您不想要的文本不匹配就更难了。@EdMorton您在“电话号码框”中输入的任何内容都应假定为电话号码。如果用户输入的值不正确,这不是谁的错,而是用户的错。我承认这不是我的专长,但当用户输入无效值时,能够告诉用户这一点并不重要,例如,他们输入了社会保险号码或邮政编码或一些货币金额(如我在之前的评论中所示)或者在电话号码框中,而不是在表格上正确的框中?如果我们只接受输入的数字,而放弃所有其他数字,我认为我们将错过一个机会,让我们的表单变得更加健壮和用户友好。是否有一个更广泛的规则,关于你想通过什么和失败什么,将这些例子联系起来?我知道他没有把它视为失败,但是它也与这些匹配,
868-000 0000
868000 0000
我想这就是答案……应该这样考虑……因为我需要一种特定的格式
^((868(\d{3}|[- ]\d{3}-))|(\(868\) \d{3} ))\d{4}$