我相信另一個答案會拒絕一些有效的url(如大寫或長子域名),並允許一些無效的(如http://www.-example-.com或www。%@ &.com)。我試圖考慮一些額外的url語法規則(沒有進入國際化)。
function isUrlValid(userInput) {
var regexQuery = "^(https?://)?(www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z0-9]{0,61}[a-z0-9]\\.[a-z]{2,6}(/[-\\[email protected]\\+\\.~#\\?&/=%]*)?$";
var url = new RegExp(regexQuery,"i");
return url.test(userInput);
}
var input = ["https://o.sub-domain.example.com/foo/bar?foo=bar&boo=far#a%20b",
"HTTP://EX-AMPLE.COM",
"example.c",
"example-.com"];
for (var i in input) document.write(isUrlValid(input[i]) + ": " + input[i] + "<br>");
中,也允許IP地址和端口號,正則表達式是:
"^(https?://)?(((www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z0-9]{0,61}[a-z0-9]\\.[a-z]{2,6})|((\\d{1,3}\\.){3}\\d{1,3}))(:\\d{2,4})?(/[-\\[email protected]\\+\\.~#\\?&/=%]*)?$"
中,也允許查詢字符串沒有域名和問號之間的斜線(這在理論上是不允許的,但在大多數現實生活中都可以使用),正則表達式是:
"^(https?://)?(((www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z0-9]{0,61}[a-z0-9]\\.[a-z]{2,6})|((\\d{1,3}\\.){3}\\d{1,3}))(:\\d{2,4})?((/|\\?)[-\\[email protected]\\+\\.~#\\?&/=%]*)?$"
爲了還確保每%後跟一個十六進制數,正則表達式是:
"^(https?://)?(((www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z0-9]{0,61}[a-z0-9]\\.[a-z]{2,6})|((\\d{1,3}\\.){3}\\d{1,3}))(:\\d{2,4})?((/|\\?)(((%[0-9a-f]{2})|[-\\[email protected]\\+\\.~#\\?&/=])*))?$"
(注:如約翰·吳在評論中提到,有正當single-letter domains)。
來源
2015-06-22 01:39:04
m69
應該是'(http(s)?:\/\ /。)?(www \。)?[ - a-zA-Z0-9 @:%._ \ +〜#=] { 2,256} \。[az] {2,6} \ b([ - a-zA-Z0-9 @:%_ \ +。〜#?&=] *)'。在https://regex101.com/上檢查上述正則表達式會給出錯誤。 – saruftw