Javascript正则表达式用于不含http的URL
Javascript正则表达式用于不含http的URL
如何修改下面的正则表达式,以便没有'http://'、'https://'、'ftp://'或'mailto://'的URL仍然被视为有效?该正则表达式来自validator.js
var url = 'www.test.com'; isURL(url); function isURL(url) { var urlRegex = '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$'; var urlT = new RegExp(urlRegex, 'i'); if(!(url.length < 2083 && urlT.test(url))) { alert("无效的URL"); } else { alert("有效的URL"); } }
将上述正则表达式修改为,即使没有'http://'、'https://'、'ftp://'或'mailto://',URL仍然被视为有效的正则表达式。
问题的出现是因为使用了validation.js库,该库默认会验证url是否包含http协议。如果不想验证http协议,可以通过设置选项将require_protocol和require_valid_protocol都设置为false。代码如下:
var isUrl = validator.isUrl(url, {require_protocol:false, require_valid_protocol:false});
但是根据上述代码和文本的描述,似乎validation.js库默认就是不要求包含http协议的。所以可能您并没有直接使用该库。
解决方法就是使用validation.js库,并设置选项require_protocol和require_valid_protocol为false,这样就可以验证不包含http协议的url。
Javascript中的正则表达式可以用来验证URL的格式。通常情况下,我们会使用类似于(?:(?:http|https|ftp)://)
的正则表达式来匹配URL中的协议部分(如http、https或ftp)。然而,有时候我们可能会遇到一个奇怪的要求,即需要验证不包含协议部分(如http://)的URL。
为了满足这个要求,我们可以使用?
来将(?:(?:http|https|ftp)://)
部分设为可选。具体来说,我们可以使用(?:(?:http|https|ftp)://)?
的正则表达式来匹配URL。
这样,当我们使用这个正则表达式验证URL时,如果URL包含协议部分(如http://),它也会被正确地匹配。而如果URL不包含协议部分,它也能够成功地匹配。
下面是一个示例代码,演示了如何使用这个正则表达式来验证URL:
const urlRegex = /^(?:(?:http|https|ftp):\/\/)?([a-zA-Z0-9-.]+(?:\.[a-zA-Z0-9-]+)*\.[a-zA-Z]{2,}(?:\/\S*)?)$/; function validateUrl(url) { return urlRegex.test(url); } console.log(validateUrl("https://www.example.com")); // true console.log(validateUrl("www.example.com")); // true console.log(validateUrl("example.com")); // true console.log(validateUrl("ftp://example.com")); // true console.log(validateUrl("http://www.example.com")); // true
通过上述代码,我们可以看到,在使用这个正则表达式验证URL时,不管URL是否包含协议部分,都能够正确地验证。
因此,通过将(?:(?:http|https|ftp)://)
设为可选,我们可以满足验证不包含协议部分的URL的需求。