URI正则表达式:如果URL有效,则用空字符串替换http://,https://,ftp://

jQu*_*ast 9 javascript regex validation jquery uri

我有一个简单的URL验证器.url验证器可能像其他验证器一样工作.

现在我想,如果传递了URL,请使用https://,http://并将其删除var b.

所以我做的是我制作另一个正则表达式,它捕获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')
   }

});
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

YuS*_*YuS 24

var b = url.substr(url.indexOf('://')+3);
Run Code Online (Sandbox Code Playgroud)

  • 这将删除_any_ URL方案标识符,而不仅仅是`https`,`http`和`ftp`. (3认同)
  • 我知道,但是没有作者想要一样吗?"https://,http://,ftp:// etc" (3认同)

Aln*_*tak 17

protomatch.test() 返回一个布尔值,而不是一个字符串.

我想你只想要:

var protomatch = /^(https?|ftp):\/\//; // NB: not '.*'
...
var b = url.replace(protomatch, '');
Run Code Online (Sandbox Code Playgroud)

FWIW,你的正则match表达式是完全难以理解的,几乎肯定是错误的.它可能不允许国际化的域名,但它很难读,我无法确定.