URI Regex:如果URL有效,则用空字符串替换http://、https://、ftp://



我有一个简单的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,因此依赖"://"可能无法涵盖所有情况。

最新更新