具有特定区号和格式的 phone 号码的正则表达式
Regex for phone number with specific area code and format
我正在尝试创建一个正则表达式来验证具有 868 区号和特定格式的特定 phone 号码
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 具有严格间距、括号、连字符和天知道其他要求的数字。
删除所有不必要的字符,验证需要验证的内容,继续生活。
$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]
包含数字
DEMO 和正则表达式的解释
你可以用一些条件来做到这一点
# ^(\()?868(?(1)\)[ ]\d{3}[ ]\d{4}|(?:(?:(-)|([ ])|)\d{3}(?(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 ?
| # 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
您可以编写一个匹配所有格式的正则表达式,但没有规定您必须这样做。
分别匹配每种格式使您的代码更具可读性:
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;
}
假设 PHP 使用像 awk
或 grep -E
这样的 ERE:
$ 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}$
任何更简短的内容都会与您未指定为有效的其他 phone 数字格式匹配,因此我假设这些格式无效。
我正在尝试创建一个正则表达式来验证具有 868 区号和特定格式的特定 phone 号码 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 具有严格间距、括号、连字符和天知道其他要求的数字。
删除所有不必要的字符,验证需要验证的内容,继续生活。
$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]
包含数字
DEMO 和正则表达式的解释
你可以用一些条件来做到这一点
# ^(\()?868(?(1)\)[ ]\d{3}[ ]\d{4}|(?:(?:(-)|([ ])|)\d{3}(?(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 ?
| # 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
您可以编写一个匹配所有格式的正则表达式,但没有规定您必须这样做。
分别匹配每种格式使您的代码更具可读性:
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;
}
假设 PHP 使用像 awk
或 grep -E
这样的 ERE:
$ 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}$
任何更简短的内容都会与您未指定为有效的其他 phone 数字格式匹配,因此我假设这些格式无效。