Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在检查前3或4个字母后,致电ReGex也接受字母_Javascript_Regex_Phone Number - Fatal编程技术网

Javascript 在检查前3或4个字母后,致电ReGex也接受字母

Javascript 在检查前3或4个字母后,致电ReGex也接受字母,javascript,regex,phone-number,Javascript,Regex,Phone Number,我在stack overflow中找到了这个很棒的正则表达式,并添加了我需要的其他格式,用于我的手机验证。但现在我被要求允许以下情况: (555)YOU-RULE (555) MEI-YOUN (555)YOURULE 555YOURULE 555 YOU RULE 555-YOU-RULE 所有这些都在1之前。我不知道如何做到这一点,因为我有下面的解决方案,没有一个数字 仅数字: var formats = "(999)999-9999|999-999-9999|(999) 999-99

我在stack overflow中找到了这个很棒的正则表达式,并添加了我需要的其他格式,用于我的手机验证。但现在我被要求允许以下情况:

(555)YOU-RULE
(555) MEI-YOUN
(555)YOURULE
555YOURULE
555 YOU RULE
555-YOU-RULE
所有这些都在1之前。我不知道如何做到这一点,因为我有下面的解决方案,没有一个数字

仅数字:

  var formats = "(999)999-9999|999-999-9999|(999) 999-9999|1(999) 999-9999|1(999)999-9999|999 999 9999|999.999.9999|1.999.999.9999|9999999999";
  var r = RegExp("^(" +
       formats
         .replace(/([\(\)])/g, "\\$1")
         .replace(/9/g,"\\d") +
       ")$");
    phoneOK = r.test(phone);

有更好的方法可以做到这一点,但是对于那些不熟悉正则表达式的人来说,不太清晰。所以如果你想继续使用这个方法,你应该首先了解这里发生了什么

您正在将自定义语法转换为正则表达式,您需要关注的是将其转换为任意数字的
9
,您需要允许其为任意数字或字母

此转换发生在第5行:

.replace(/9/g,"\\d") +
\d
是任何数字的术语,因此我们必须使其表示任何数字或字母。最简单的方法可能是将其更改为
[\dA-Z]
。我在这里假设您只需要大写,如果您还需要小写,请将其更改为:
[\dA-Za-z]

.replace(/9/g,"[\\dA-Z]") +
然而,看看你的例子,看起来你也只想要前三位数字。这需要一个新的规则。我们将其命名为
0
,并相应地更新格式:

var formats = "(000)999-9999|000-999-9999|(000) 999-9999|1(000) 999-9999|1(00)999-9999|000 999 9999|000.999.9999|1.000.999.9999|0009999999";
现在在第5行之后添加转换:

.replace(/0/g,"\\d") +
您会注意到它与旧的第5行相同

因此,我们总共得到:

var formats = "(000)999-9999|000-999-9999|(000) 999-9999|1(000) 999-9999|1(00)999-9999|000 999 9999|000.999.9999|1.000.999.9999|0009999999";
var r = RegExp("^(" +
   formats
     .replace(/([\(\)])/g, "\\$1")
     .replace(/9/g,"[\\dA-Z]")
     .replace(/0/g,"\\d") +
   ")$");
phoneOK = r.test(phone);

你真是个了不起的人,谢谢你的解释。现在很清楚了。我之所以选择这一行,是因为最终我们将构建一些东西,允许用户选择他们的验证。@ergwin,FWI:我刚刚测试了它,并对第5行做了一个小的修改。值得指出的是,您的表达式将只验证美国格式的电话号码。大多数海外国家使用不同的格式。这对你来说可能重要,也可能不重要,这取决于你的目标受众,但无论如何,为了稍后阅读此问题的其他人的利益,值得一提。