【问题标题】:Issue with a regex to validate the Nigerian phone numbering system验证尼日利亚电话号码系统的正则表达式问题
【发布时间】:2022-01-07 22:19:14
【问题描述】:

我正在使用正则表达式来匹配这组数字:

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
  • 如上所述的可选括号。

这是为了验证尼日利亚电话号码系统。我进行了广泛的搜索,到目前为止还没有看到任何好的解决方案。

我有这样的表达方式:

/^(\+)?234[0-9]*?.*/gm

但它与没有 (234) 的不匹配。

具体来说:

xxxx xxx xxxx
01 xxx xxxx
xxxx-xxx-xxxx
xxxxxxxxxxx

我怎样才能做到这一点?我对正则表达式有点陌生,如果能得到任何帮助,我将不胜感激。

Demo

【问题讨论】:

  • 您的示例长度通常不是 11 位数。我们应该怎么做?
  • 最多 11 位数字(任何数字组合,不包括静态部分)- 已编辑
  • 目前还不清楚,这意味着,我(或者,我相信任何人)都无法给出明确的答案。试试regex101.com/r/I9CiSe/1,“try-this-or-that”是我们现在可以使用的唯一方法,但请注意它对 SO 没有什么意义,我们希望建立一个明确的可重用问题和答案的 F&Q 基础。跨度>
  • @WiktorStribiżew 我在这里比较新。下次我会尽量遵守规则。感谢您的理解,无论如何,您的回答就是我(和很多人)所需要的。谢谢。

标签: php regex pcre phone-number


【解决方案1】:

你可以使用

^(?:(?:(?:\+?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} - 四位数字
  • $ - 字符串结束。

要匹配较长字符串中任意位置的电话号码,请使用

(?:(?:(?:\+?234(?:\h1)?|01)\h*)?(?:\(\d{3}\)|\d{3})|\d{4})(?:\W*\d{3})?\W*\d{4}(?!\d)

请参阅regex demo

【讨论】:

  • 当我删除^ 开始和$ 结束标志以尝试匹配任何地方而不是完全匹配时,它会从右侧修剪99999999999 1 个数字,例如现在匹配9999999999,这是错误的.. @Wiktor
  • @user627341 你不能扔掉锚。有关适用于内联匹配的版本,请参阅我的答案的底部。
  • 仅在数字用空格分隔时有效。是否有可能让它在任何地方匹配,无论它周围有什么字符..就像我上面的第一条评论一样?例如。 99999999999fwaefdfs234(999)999-9999 应该都匹配。我打算在 PHP 的 preg_match_all() 上使用它。
  • @user627341 但是当他们是另一个号码的一部分时肯定不是,对吧?使用(?:(?:(?:\+?234(?:\h1)?|01)\h*)?(?:\(\d{3}\)|\d{3})|\d{4})(?:\W*\d{3})?\W*\d{4}(?!\d)
  • 是的,这正是我所需要的。非常感谢。
【解决方案2】:

用一些简单的东西:

$output = trim(filter_var($input, FILTER_SANITIZE_NUMBER_INT), '+');  

您将只剩下数字。现在您可能想要删除几个可选的开始:

$output = preg_replace('/^0|^01|^234|^2341/', '', $input);

最后你可能想检查长度是否有效。

这不会使像“+234(123) (456) 7890”这样的数字无效,但应该这样吗?毕竟,你只能拨号码。

【讨论】:

  • 感谢您的新鲜观点。非常感谢。虽然我已经写了一些类似于你已经写的东西。只是在接受挑战,看看我是否可以有一个通用的表达方式。再次感谢。
  • 不客气。我保持简单。
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多