我想用regexp验证一个url

时间:2017-10-05 07:07:59

标签: javascript regex

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

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

我想要一个可以验证此类网址的RegExp(注意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

这个网址是真的,我不知道为什么......

我的正则表达式的

第一部分说:网址的开头可能有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))?)?$

问题: 在第二部分中,当我说:\.时,我期待一个点,但是它不能识别它,我怎么能明确并要求它?

1 个答案:

答案 0 :(得分:2)

我将正则表达式分解为部分:

^
((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