在JavaScript中是否有一种方法来检查字符串是否是URL?
regex被排除在外,因为URL很可能写成stackoverflow;也就是说,它可能没有。com, WWW或http。
在JavaScript中是否有一种方法来检查字符串是否是URL?
regex被排除在外,因为URL很可能写成stackoverflow;也就是说,它可能没有。com, WWW或http。
当前回答
该问题询问一个url(如stackoverflow)的验证方法,而没有协议或主机名中的任何点。因此,这不是验证url sintax的问题,而是通过实际调用它来检查它是否是一个有效的url。
我尝试了几种方法来知道url是否真实存在,并且可以从浏览器中调用,但没有找到任何方法来测试javascript调用的响应头:
添加一个锚元素可以触发click()方法。 使用'GET'对具有挑战性的url进行ajax调用是可以的,但由于CORS政策,它有各种限制,并且不是使用ajax的情况,因为url可能在我的服务器域之外。 使用fetch API有一个类似ajax的解决方案。 另一个问题是,我有我的服务器在https协议下,并在调用非安全url时抛出异常。
所以,我能想到的最好的解决方案是得到一些工具来执行CURL使用javascript尝试像CURL -I <url>。不幸的是,我没有找到任何,在外观上,这是不可能的。我将感谢任何关于这一点的评论。
但是,最后,我有一个运行PHP的服务器,因为我几乎所有的请求都使用Ajax,所以我在服务器端编写了一个函数来执行curl请求并返回到浏览器。
关于“stackoverflow”问题上的单个单词url,它将引导我到https://daniserver.com.ar/stackoverflow,其中daniserver.com.ar是我自己的域名。
其他回答
2020年更新。 为了扩展@iamnewton和@ fernando Chavez Herrera的精彩回答,我已经开始看到@被用于url的路径。
所以更新后的正则表达式是:
RegExp('(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+@]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$', 'i');
如果你想在查询字符串和哈希中允许它,使用:
RegExp('(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+@]*)*(\\?[;&a-z\\d%_.~+=-@]*)?(\\#[-a-z\\d_@]*)?$', 'i');
话虽如此,我不确定是否有白皮书规则禁止在查询字符串或哈希中使用@。
function isURL(_url)
{
let result = false;
let w = window;
if (!w._check_input)
{
let input = document.createElement("input");
input.type = "url";
input.required = true;
w._check_input = input;
}
w._check_input.value = _url;
if (w._check_input.checkValidity()) result = true;
return result;
}
该问题询问一个url(如stackoverflow)的验证方法,而没有协议或主机名中的任何点。因此,这不是验证url sintax的问题,而是通过实际调用它来检查它是否是一个有效的url。
我尝试了几种方法来知道url是否真实存在,并且可以从浏览器中调用,但没有找到任何方法来测试javascript调用的响应头:
添加一个锚元素可以触发click()方法。 使用'GET'对具有挑战性的url进行ajax调用是可以的,但由于CORS政策,它有各种限制,并且不是使用ajax的情况,因为url可能在我的服务器域之外。 使用fetch API有一个类似ajax的解决方案。 另一个问题是,我有我的服务器在https协议下,并在调用非安全url时抛出异常。
所以,我能想到的最好的解决方案是得到一些工具来执行CURL使用javascript尝试像CURL -I <url>。不幸的是,我没有找到任何,在外观上,这是不可能的。我将感谢任何关于这一点的评论。
但是,最后,我有一个运行PHP的服务器,因为我几乎所有的请求都使用Ajax,所以我在服务器端编写了一个函数来执行curl请求并返回到浏览器。
关于“stackoverflow”问题上的单个单词url,它将引导我到https://daniserver.com.ar/stackoverflow,其中daniserver.com.ar是我自己的域名。
在我的情况下,我唯一的要求是,用户输入不会被解释为一个相对链接时,放置在一个标签的href和这里的答案要么有点OTT,要么允许url不符合我的要求,所以这就是我要做的:
^https?://.+$
没有正则表达式,同样的事情也可以很容易地实现。
一个有答案的相关问题
或者来自Devshed的Regexp:
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);
}