【问题标题】:I want to validate an url with a regexp我想用正则表达式验证 url
【发布时间】:2017-10-05 07:07:58
【问题描述】:

我在 JS 中有这个 RegExp,我正在使用 .test() 方法来验证 url:

new RegExp(/^((https|http):\/\/www\.)?(www\.)?[a-z0-9_-]+\.[a-z]+(\/)?(\/[a-z0-9]+(\.(php|html|asp|aspx))?)?$/i)

我想要一个可以验证此类 url 的正则表达式(注意 http 和 https 之类的东西):

https://www.page.com/about.php
https://www.page.com/about 
https://www.page.com/  
www.page.com
page.com
page-10.com
1234.com

当我尝试这些网址时,此 RegExp 有效,除非我尝试此网址:

www.page

它认为那个url是真的,我不知道为什么......

我的正则表达式的第一部分说:网址可以有 https|http://www.www. 在开头或没有。

/^((https|http):\/\/www\.)?(www\.)?

第二部分说:在第一部分之后会有字母,数字,一些符号+ 一个点(我认为这是我的错误的来源。为什么它没有'不认识点?)+更多字母,结果可能类似于 page-10.com

[a-z0-9_-]+\.[a-z]+

第三部分是可选的,它允许使用斜杠和扩展名,如 page.com /about.php:

(\/)?(\/[a-z0-9]+(\.(php|html|asp|aspx))?)?$

问题: 在第二部分中,当我说:\. 时,我期望一个点,但它不识别它,我该如何明确并要求它?

【问题讨论】:

标签: javascript regex


【解决方案1】:

我将你的正则表达式分解为多个部分:

^
((https|http):\/\/www\.)? # Match http://www. or https://www. OR NOTHING
(www\.)? # Match www. OR NOTHING
[a-z0-9_-]+\. # Match at least 1 character in group [a-z0-9_-] followed by a dot
[a-z]+(\/)? # Match at least 1 character in group [a-z] followed by "/" OR NOTHING
(\/[a-z0-9]+(\.(php|html|asp|aspx))?)? # Match at least 1 character in group [a-z0-9] followed by a web page file extension OR NOTHING
$

如您所见,如果“OR NOTHING”没有出现在您的测试字符串中,则它没有任何意义。所以你的www.page 的测试用例由以下部分匹配:

[a-z0-9_-]+\. # Match at least 1 character in group [a-z0-9_-] followed by a dot
[a-z]+(\/)? # Match at least 1 character in group [a-z] followed by "/" OR NOTHING

那么你就有了问题的答案:

问题:在第二部分中,当我说:. 时,我期望一个点,但它 不认识,我怎么能明确要求呢?


你的正则表达式的固定版本:

^((https|http):\/\/)?(www\.)?([\w-]{2,}\.[\w-]{2,3}\.[\w-]{2,3}|[\w-]{2,}\.[a-zA-Z]{2,3})(\/[a-z0-9]+(\.(php|html|asp|aspx))?)?$

匹配测试结果:https://regex101.com/r/wGp68e/6

【讨论】:

  • 感谢您的回答,我正在测试您的正则表达式,但它有一些问题,例如:ww-w.page.com(返回 true),即使它可以允许第一部分中的任何内容,例如:wwwwpage .page.com
  • 在您编辑的答案中,我刚刚发现 1 个错误:如果在第一个点之后写了 2 或 3 个字母、符号 (-_) 或数字,那么它返回 true,并且在您可以写的第一个点之前无限制的字符串。这将返回 true:1234567._-d(但顺便说一句,它只会在点后有 2 或 3 个字符时发生 :))
  • 我修复了你指出的情况。如果有任何错误,请告诉我。
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 2015-09-07
  • 2013-08-24
  • 2011-07-30
  • 1970-01-01
  • 2012-03-29
  • 2011-06-17
相关资源
最近更新 更多