我有一个简单的URL验证器。url验证器可能和其他验证器一样工作。
现在我希望,如果URL通过了,则使用https://、http://并将其删除为var b
。
所以我所做的是,我制作了另一个Regex,它捕获https://、http://、ftp://等,并说如果url通过了长测试,那么获取第二个测试,并用空字符串替换它。
以下是我的想法:
$("button").on('click', function () {
var url = $('#in').val();
var match = /^([a-z][a-z0-9*-.]*)://(?:(?:(?:[w.-+!$&'()*+,;=]|%[0-9a-f]{2})+:)*(?:[w.-+%!$&'()*+,;=]|%[0-9a-f]{2})+@)?(?:(?:[a-z0-9-.]|%[0-9a-f]{2})+|(?:[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})]))(?::[0-9]+)?(?:[/|?](?:[w#!:.?+=&@!$'~*,;/()[]-]|%[0-9a-f]{2})*)?$/;
var protomatch = /^(https?|ftp)://(.*)/;
if (match.test(url)) { // IF VALID
console.log(url + ' is valid');
// if valid replace http, https, ftp etc with empty
var b = url.replace(protomatch.test(url), '');
console.log(b)
} else { // IF INVALID
console.log('not valid')
}
});
为什么这不起作用?
var b = url.substr(url.indexOf('://')+3);
protomatch.test()
返回布尔值,而不是字符串。
我想你只想:
var protomatch = /^(https?|ftp):///; // NB: not '.*'
...
var b = url.replace(protomatch, '');
FWIW,您的match
正则表达式是完全无法理解的,几乎可以肯定是错误的。它可能不允许国际化域名,但它太难阅读了,我无法确定。
如果你想要一种更通用的方法,比如Yuri的方法,但它适用于更多的情况:
var b = url.replace(/^.*:///i, '');
可能有一个空协议,如://example.com,因此依赖"://"可能无法涵盖所有情况。