检查 JavaScript 字符串是否为 URL

IT技术 javascript string url
2021-02-03 06:22:08

JavaScript 中有没有办法检查字符串是否是 URL?

正则表达式被排除在外,因为 URL 很可能是这样写的stackoverflow也就是说,它可能没有.com,wwwhttp

6个回答

如果你想检查一个字符串是否是有效的 HTTP URL,你可以使用URL构造函数(它会抛出格式错误的字符串):

function isValidHttpUrl(string) {
  let url;
  
  try {
    url = new URL(string);
  } catch (_) {
    return false;  
  }

  return url.protocol === "http:" || url.protocol === "https:";
}

请注意,根据RFC 3886,URL 必须以方案开头(不限于 http/https),例如:

  • www.example.com 不是有效的 URL(缺少方案)
  • javascript:void(0) 是有效的 URL,虽然不是 HTTP 的
  • http://..是主机所在的有效 URL ..(是否解析取决于您的 DNS)
  • https://example..com 是有效的 URL,同上
新网址('javascript:alert(23)')
2021-03-11 06:22:08
@Pavlo 这返回 true isValidUrl("javascript:void(0)")
2021-03-29 06:22:08
URL 从 Edge 开始工作,因此它下面的所有内容可能无法按您预期的那样工作。确保先检查兼容性。
2021-04-01 06:22:08
@AshD 不,不是;例如,你不能因为使用href属性的<a>有效的 URL必须以方案名称开头,例如https://.
2021-04-02 06:22:08
我喜欢用这个来教我关于 js 的新东西!它没有我能找到的假阴性。它确实有一些误报:http://..或者http:///a
2021-04-10 06:22:08

一个有答案的相关问题

或者来自Devshed 的这个正则表达式

function validURL(str) {
  var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol
    '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name
    '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
    '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path
    '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string
    '(\\#[-a-z\\d_]*)?$','i'); // fragment locator
  return !!pattern.test(str);
}
如果我们将“11111111111111111111111111111111111111111111111”作为输入服务器将挂起。我遇到了这个问题,然后将我的代码改为 str.match(/(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\ +~#=]{2,256}\.[az]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g) ;
2021-03-17 06:22:08
www.jayakumar 这是一个有效的网址吗?它返回真
2021-03-22 06:22:08
与 @ 的链接失败 - 就像 https://medium.com/@User_name/
2021-04-02 06:22:08
function isURL(str) {
  var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol
  '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|'+ // domain name
  '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
  '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path
  '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string
  '(\\#[-a-z\\d_]*)?$','i'); // fragment locator
  return pattern.test(str);
}
这是无法使用的缓慢
2021-03-15 06:22:08
它返回trueaaa
2021-03-21 06:22:08
谷歌搜索图片链接失败: http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&docid=nIv5rk2GyP3hXM&tbnid=isiOkMe3nCtexM:&ved=0CAUQjRw&url=http%3A%2F%2Fanimalcrossing.wikia.com%2Fwiki%2FLion&ei=ygZXU_2fGKbMsQTf4YLgAQ&bvm=bv.65177938,d.aWc&psig=AFQjCNEpBfKnal9kU7Zu4n7RnEt2nerN4g&ust=1398298682009707
2021-03-26 06:22:08
这绝对不应该是正确答案。它未能通过许多测试用例,更重要的是它甚至会将您的页面挂在一个短字符串上:isURL('12345678901234567890123')添加更多字符,情况更糟。
2021-03-26 06:22:08
@HernánEche 你说的是什么意思start = new Date(); isURL("http://michalstefanow.com"); end = new Date(); diff = end - start; console.log(diff)我放了一个水壶,去厕所,给我妈妈打电话,事情很快就完成了……
2021-04-04 06:22:08

我建议使用锚元素,而不是使用正则表达式。

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

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,那么这些辅助属性的值将是空字符串。

编辑:正如评论中所指出的:如果使用了无效的 url,则可能会替换当前 URL 的属性。

因此,只要您不传入当前页面的 URL,您就可以执行以下操作:

function isValidURL(str) {
   var a  = document.createElement('a');
   a.href = str;
   return (a.host && a.host != window.location.host);
}
function isValidURL(str): 比使用正则表达式好多了!谢谢!
2021-03-11 06:22:08
解决问题的非常简单的方法。这些属性是实验性的:developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement
2021-03-13 06:22:08
嘎!那真是怪了。我发誓我测试过这个!我认为可以公平地说,这真的不必在当前页面上使用,因此可以更改条件。我会编辑帖子。
2021-03-15 06:22:08
这不是一个非常典型的用例,但是这种技术在 Firefox 浏览器窗口的上下文中不起作用(对于插件开发很重要)
2021-03-30 06:22:08
情况并非如此(至少在 Chrome 48 中)。如果传递给的 urla.href无效,则parser.host返回您当前所在页面的主机名,而不是预期的false.
2021-04-02 06:22:08

我正在使用下面的函数来验证有或没有的 URL http/https

function isValidURL(string) {
  var res = string.match(/(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g);
  return (res !== null)
};

var testCase1 = "http://en.wikipedia.org/wiki/Procter_&_Gamble";
console.log(isValidURL(testCase1)); // return true

var testCase2 = "http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&docid=nIv5rk2GyP3hXM&tbnid=isiOkMe3nCtexM:&ved=0CAUQjRw&url=http%3A%2F%2Fanimalcrossing.wikia.com%2Fwiki%2FLion&ei=ygZXU_2fGKbMsQTf4YLgAQ&bvm=bv.65177938,d.aWc&psig=AFQjCNEpBfKnal9kU7Zu4n7RnEt2nerN4g&ust=1398298682009707";
console.log(isValidURL(testCase2)); // return true

var testCase3 = "https://sdfasd";
console.log(isValidURL(testCase3)); // return false

var testCase4 = "dfdsfdsfdfdsfsdfs";
console.log(isValidURL(testCase4)); // return false

var testCase5 = "magnet:?xt=urn:btih:123";
console.log(isValidURL(testCase5)); // return false

var testCase6 = "https://stackoverflow.com/";
console.log(isValidURL(testCase6)); // return true

var testCase7 = "https://w";
console.log(isValidURL(testCase7)); // return false

var testCase8 = "https://sdfasdp.ppppppppppp";
console.log(isValidURL(testCase8)); // return false

它返回 true sadf@gmail.com......应该吗?我想不应该
2021-03-20 06:22:08
@Basj 添加了测试用例。请检查
2021-03-21 06:22:08
不错,未能通过 http://⌘.ws 或142.42.1.1并且它允许 http://.www.foo.bar./ 但它不像其他一些正则表达式(包括评分最高的答案)那样挂起。
2021-03-25 06:22:08
似乎是一个不错的解决方案!您能否添加一些测试以显示它在某些极端情况下有效(例如参见这些评论)?
2021-03-28 06:22:08
此代码未验证协议请参阅您的自我 url = 'htt1ps://googl1e.com' console.log(url + ' -> ' + isValidURL(url))
2021-03-29 06:22:08