Jquery验证:正则表达式匹配非美国电话号码

3

我正在使用这个:

jQuery.validator.addMethod("regex2", function(value, element, param) {
  return value.match(new RegExp("." + param + "$"));
});

$("#phonenumber").rules("add", { regex2: "[0-9]+"})

验证电话号码。电话号码必须至少为7位数字,我从其他地方获取了此正则表达式,并使用参数minlength=7,但显然这是不合适的。应该如何进行验证?
我住在委内瑞拉。所以我认为这个是无用的。我该怎么改变它?在我的国家,0416-414 33 44应该被视为有效的电话号码输入。

在末尾是否必须有一个空格,还是可选的?它必须是恰好一个空格,还是可以多于一个?它必须是空格字符(U+0020),还是可以是任何空白字符? - Mark Byers
不一定非要有那个空格,我会根据 alcuadrado 的答案来修改问题,因为它似乎是最好的解决方案。 - andandandand
4个回答

3
假设:
  • 空格字符可以是任何空白字符。
  • 空格是可选的。
  • 可能有多个空格。
  • 必须至少有七个数字。
然后将"[0-9]+"更改为"[0-9]{7,}\s*$"
还有,看起来"."是不正确的,应该是"^"

问题在于它破坏了验证。它会将空格视为数字,用户可能只在电话字段中输入空格。 - andandandand

2

您不能先修剪再验证,或者只需在此行中的$之前添加\s?

  return value.match(new RegExp("." + param + "$"));

将?替换为*以允许接受多个空格。

\b 表示单词边界,而不是空格。 - Mark Byers
实际上,修剪似乎是最好的选择。我想接受像“-”和空格这样的字符供用户编写,但不将它们视为数字,因为我需要电话号码至少有7个数字的要求。 - andandandand

2

你确定正则表达式前面的是.吗?我想知道这是否应该是一个与$相对应的插入符号^:它将正则表达式锚定,使整个字符串都必须匹配正则表达式。

你可以在正则表达式中添加空格,但更优雅的解决方案是先修剪它。修剪字符串会从开头和结尾删除空格。这两种方法都可以:

// Trim value before matching against regex.
return jQuery.trim(value).match(new RegExp("^" + param + "$"));

// Allow spaces at beginning or end with " *" (space + asterisk).
return value.match(new RegExp("^ *" + param + " *$"));

另外,顺便说一下,您可以在param周围添加括号,使其更加健壮。

// Add parentheses for robustness.
return jQuery.trim(value).match(new RegExp("^(?:" + param + ")$"));

这样,即使param是this|that,您的新正则表达式也能正常工作。 您需要匹配^(this|that)$而不是^this|that$,因为后者会等同于不正确的(^this)|(that$)


这很有帮助和启发性。我最终在其他地方使用了它。谢谢。 - andandandand

2
您可能会发现以下正则表达式很有用,它基本上首先删除所有世界各地电话号码可以包含的有效特殊字符(空格,括号,+-.ext),然后计算数字是否至少为7。
$.validator.addMethod('phone', function(value, element) {
    return this.optional(element) || (/^\d{7,}$/).test(value.replace(/[\s()+\-\.]|ext/gi, ''));
});

将其与 <input class="phone"> 一起使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接