【问题标题】:Regex phone validation正则表达式电话验证
【发布时间】:2012-05-04 00:33:13
【问题描述】:

我创建了一个 reg Exp,它基本上允许我喜欢它允许的所有格式。不过()还是有点问题的...

^\(?(\+?\d+)?\)? ?\d*(-?\d{2,3} ?){0,4}$

这将是有效的:(+356-123 456 78,但它不应该......与 +356 相同)-123 456 78。

任何人都知道如何确保模式包含 () 或都不包含?

【问题讨论】:

标签: php regex validation phone-number


【解决方案1】:

首先,请注意,您不能编写检查平衡括号的正则表达式。如果您只想允许一对括号,您可以制作一个正则表达式以确保它们要么都存在,要么都不存在。但是,如果您想允许任意数量的括号,但只能成对出现,那么正则表达式就不足以完成这项工作;你需要一个真正的解析器。

就我个人而言,我只会去掉除数字、空格和+ 符号之外的任何电话号码。这是 ITU-T 标准 E.123 推荐的国际符号,无需担心括号。

【讨论】:

  • 您可以使用反向引用等来做到这一点,但这值得所有的麻烦吗?
  • “你不能编写一个检查平衡括号的正则表达式” - 例如。 \((?R)*\)
  • 什么是 (?R)?匿名递归?无论如何,一旦有了类似的东西,它就不再是真正的“正则表达式”了。
【解决方案2】:

试试这个:

^(?:\((\+?\d+)?\)|\+?\d+) ?\d*(-?\d{2,3} ?){0,4}$

它允许区号有带括号或不带括号的区号。

【讨论】:

  • 谢谢,这就是我要找的!
【解决方案3】:

处理此问题的最简单方法是去除非数字并规范电话号码字段中的空白。十个人在电话号码字段中输入许多愚蠢的格式。我建议分两步进行:

// Strip non-numbers and whitespace
var cleanPhone = phoneNumber.replace( /[^0-9\s]/, "" );

// All whitespace are now single spaces
cleanPhone = cleanPhone.replace( /\s+/, " " );

if( cleanPhone.match(/* place your (now simple) validation regex here */) ) {
    // Valid!
}

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多