检查一个Javascriptstring是否是一个url

有没有在JavaScript的方式来检查,如果一个string是一个url?

RegExes被排除在外,因为url最有可能写成像stackoverflow ; 也就是说它可能没有.com,www或http

一个相关的问题与答案:

Javascript的正则expression式的URL匹配

或Devshed的这个Regexp:

 function ValidURL(str) { var pattern = new RegExp('^(https?:\/\/)?'+ // protocol '((([az\d]([az\d-]*[az\d])*)\.)+[az]{2,}|'+ // domain name '((\d{1,3}\.){3}\d{1,3}))'+ // OR ip (v4) address '(\:\d+)?(\/[-az\d%_.~+]*)*'+ // port and path '(\?[;&a-z\d%_.~+=-]*)?'+ // query string '(\#[-az\d_]*)?$','i'); // fragment locater if(!pattern.test(str)) { alert("Please enter a valid URL."); return false; } else { return true; } } 
 function isURL(str) { var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol '((([az\\d]([az\\d-]*[az\\d])*)\\.?)+[az]{2,}|'+ // domain name '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address '(\\:\\d+)?(\\/[-az\\d%_.~+]*)*'+ // port and path '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string '(\\#[-az\\d_]*)?$','i'); // fragment locator return pattern.test(str); } 

我不build议使用正则expression式,而是使用一个锚点元素。

当您设置anchorhref属性时,会设置各种其他属性。

 var parser = document.createElement('a'); parser.href = "http://example.com:3000/pathname/?search=test#hash"; parser.protocol; // => "http:" parser.hostname; // => "example.com" parser.port; // => "3000" parser.pathname; // => "/pathname/" parser.search; // => "?search=test" parser.hash; // => "#hash" parser.host; // => "example.com:3000" 

资源

但是,如果绑定的值href不是有效的url,那么这些辅助属性的值将是空string。

编辑:如在评论中指出:如果使用了一个无效的url,当前URL的属性可能会被replace。

所以,只要你没有传递当前页面的URL,你可以做如下的事情:

 function isValidURL(str) { var a = document.createElement('a'); a.href = str; return (a.host && a.host != window.location.host); } 

下面显示了使用javascriptvalidationURL

 function ValidURL(str) { var regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/; if(!regex .test(str)) { alert("Please enter valid URL."); return false; } else { return true; } } 

依靠一个库: https : //www.npmjs.com/package/valid-url

 import { isWebUri } from 'valid-url'; // ... if (!isWebUri(url)) { return "Not a valid url."; } 

改进接受的答案…

  • 双反斜杠(\\)
  • 确保域具有点和扩展名(.com .io .xyz)
  • 在path中允许冒号(:),例如http://thingiverse.com/download:1894343
  • 在path中允许&符号(&),例如http://en.wikipedia.org/wiki/Procter_&_Gamble
  • 在path中允许@符号,例如https://medium.com/@techytimo

     isURL(str) { var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol '((([az\\d]([az\\d-]*[az\\d])*)\\.)+[az]{2,}|'+ // domain name and extension '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address '(\\:\\d+)?'+ // port '(\\/[-az\\d%@_.~+&:]*)*'+ // path '(\\?[;&a-z\\d%@_.,~+&:=-]*)?'+ // query string '(\\#[-az\\d_]*)?$','i'); // fragment locator return pattern.test(str); } 

我不能评论最接近的post#5717133 ,但下面是我想出了如何获得@ tom-gullen正则expression式工作的方式。

 /^(https?:\/\/)?((([az\d]([az\d-]*[az\d])*)\.)+[az]{2,}|((\d{1,3}\.){3}\d{1,3}))(\:\d+)?(\/[-az\d%_.~+]*)*(\?[;&a-z\d%_.~+=-]*)?(\#[-az\d_]*)?$/i 

你可以尝试使用URL构造函数 :如果它不抛出,string是一个有效的URL:

 const isValidUrl = (string) => { try { new URL(string); return true; } catch (_) { return false; } } 

(我没有代表评论ValidURL的例子,因此发表这个答案。)

尽pipe不鼓励使用协议相对URL( 与协议相关的URL ),但他们有时也会被雇用。 要使用正则expression式validation这样的URL,协议部分可以是可选的,例如:

 function isValidURL(str) { var pattern = new RegExp('^((https?:)?\\/\\/)?'+ // protocol '((([az\\d]([az\\d-]*[az\\d])*)\\.)+[az]{2,}|'+ // domain name '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address '(\\:\\d+)?(\\/[-az\\d%_.~+]*)*'+ // port and path '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string '(\\#[-az\\d_]*)?$','i'); // fragment locater if (!pattern.test(str)) { return false; } else { return true; } } 

正如其他人指出的那样,正则expression式似乎并不是validationURL的最佳方法。