发布正则表达式以验证尼日利亚 phone 编号系统
Issue with a regex to validate the Nigerian phone numbering system
我正在研究一个正则表达式来匹配这组数字:
xxxx xxx xxxx
01 xxx xxxx
+234 1 xxx xxxx
xxxx-xxx-xxxx
xxxxxxxxxxx
234 xxx xxx xxxx
234(xxx)xxx-xxxx
234(xxx)xxx xxxx
+234(xxx)xxx xxxx
+234(xxx) xxx xxxx
+234(xxx)xxx-xxxx
234xxxxxxxxxx
+234xxxxxxxxxx
规则是:
- 最多11位数字(任意数字组合,不包括静态部分)
- 可选 (234) 或 (+234)
- 可选1或01或234 1
- 如上所述的可选包围。
这是为了验证尼日利亚的 phone 编号系统。找了很久都没有找到好的解决方法。
我有这样的表达:
/^(\+)?234[0-9]*?.*/gm
但是没有(234)的就不能正常匹配
具体来说:
xxxx xxx xxxx
01 xxx xxxx
xxxx-xxx-xxxx
xxxxxxxxxxx
我怎样才能完成这项工作?我对正则表达式有点陌生,希望能得到任何帮助。
简单如:
$output = trim(filter_var($input, FILTER_SANITIZE_NUMBER_INT), '+');
您将只剩下数字。现在您可能想要删除几个可选的开始:
$output = preg_replace('/^0|^01|^234|^2341/', '', $input);
最后你可能想检查长度是否有效。
这不会使“+234(123) (456) 7890”这样的数字无效,但是应该吗?毕竟只能拨号码。
你可以使用
^(?:(?:(?:\+?234(?:\h1)?|01)\h*)?(?:\(\d{3}\)|\d{3})|\d{4})(?:\W*\d{3})?\W*\d{4}$
参见regex demo。 详情:
^
- 字符串的开头
(?:(?:(?:\+?234(?:\h1)?|01)\h*)?(?:\(\d{3}\)|\d{3})|\d{4})
:
(?:(?:\+?234(?:\h1)?|01)\h*)?
- 可选的出现
(?:\+?234(?:\h1)?|01)
- 可选的 +
,然后是可选的 234
,后跟水平空格和 1
,或 01
\h*
- 零个或多个水平空格
(?:\(\d{3}\)|\d{3})|
- (
, 三位数, )
或三位数, 或
\d{4}
- 四位数
(?:\W*\d{3})?
- 零个或多个非单词字符的可选序列,然后是 3 个数字
\W*
- 零个或多个非单词字符
\d{4}
- 四位数
$
- 字符串结尾。
要匹配较长字符串中任意位置的 phone 数字,请使用
(?:(?:(?:\+?234(?:\h1)?|01)\h*)?(?:\(\d{3}\)|\d{3})|\d{4})(?:\W*\d{3})?\W*\d{4}(?!\d)
参见regex demo。
我正在研究一个正则表达式来匹配这组数字:
xxxx xxx xxxx
01 xxx xxxx
+234 1 xxx xxxx
xxxx-xxx-xxxx
xxxxxxxxxxx
234 xxx xxx xxxx
234(xxx)xxx-xxxx
234(xxx)xxx xxxx
+234(xxx)xxx xxxx
+234(xxx) xxx xxxx
+234(xxx)xxx-xxxx
234xxxxxxxxxx
+234xxxxxxxxxx
规则是:
- 最多11位数字(任意数字组合,不包括静态部分)
- 可选 (234) 或 (+234)
- 可选1或01或234 1
- 如上所述的可选包围。
这是为了验证尼日利亚的 phone 编号系统。找了很久都没有找到好的解决方法。
我有这样的表达:
/^(\+)?234[0-9]*?.*/gm
但是没有(234)的就不能正常匹配
具体来说:
xxxx xxx xxxx
01 xxx xxxx
xxxx-xxx-xxxx
xxxxxxxxxxx
我怎样才能完成这项工作?我对正则表达式有点陌生,希望能得到任何帮助。
简单如:
$output = trim(filter_var($input, FILTER_SANITIZE_NUMBER_INT), '+');
您将只剩下数字。现在您可能想要删除几个可选的开始:
$output = preg_replace('/^0|^01|^234|^2341/', '', $input);
最后你可能想检查长度是否有效。
这不会使“+234(123) (456) 7890”这样的数字无效,但是应该吗?毕竟只能拨号码。
你可以使用
^(?:(?:(?:\+?234(?:\h1)?|01)\h*)?(?:\(\d{3}\)|\d{3})|\d{4})(?:\W*\d{3})?\W*\d{4}$
参见regex demo。 详情:
^
- 字符串的开头(?:(?:(?:\+?234(?:\h1)?|01)\h*)?(?:\(\d{3}\)|\d{3})|\d{4})
:(?:(?:\+?234(?:\h1)?|01)\h*)?
- 可选的出现(?:\+?234(?:\h1)?|01)
- 可选的+
,然后是可选的234
,后跟水平空格和1
,或01
\h*
- 零个或多个水平空格
(?:\(\d{3}\)|\d{3})|
-(
, 三位数,)
或三位数, 或\d{4}
- 四位数
(?:\W*\d{3})?
- 零个或多个非单词字符的可选序列,然后是 3 个数字\W*
- 零个或多个非单词字符\d{4}
- 四位数$
- 字符串结尾。
要匹配较长字符串中任意位置的 phone 数字,请使用
(?:(?:(?:\+?234(?:\h1)?|01)\h*)?(?:\(\d{3}\)|\d{3})|\d{4})(?:\W*\d{3})?\W*\d{4}(?!\d)
参见regex demo。