【问题标题】:URI Regex: Replace http://, https://, ftp:// with empty string if URL validURI 正则表达式:如果 URL 有效,则将 http://、https://、ftp:// 替换为空字符串
【发布时间】:2012-02-06 19:57:34
【问题描述】:

我有一个简单的 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')
   }

});

为什么这不起作用?

【问题讨论】:

  • 因为 protomatch.test(url) 返回 true 或 false,而不是字符串
  • 您在那里使用的正则表达式远远超出了理智的范围。你必须把它拆开,否则它是一堆难以管理、难以理解、难以维护的字符,在这种状态下它对你没有任何好处。尝试分阶段的方法: 第一阶段:基本结构测试,将这些基本结构分组。第 2 阶段:对组进行更多基本测试以确定其内容: 第 3 阶段:个人有效性测试和从中提取价值。是的,它的代码多一点,但不会让你头疼,而且 bug 也会更少。
  • @tomalak 我从这里选择它:mathiasbynens.be/demo/url-regex。我正在努力创建自己的整个正则表达式,我发现这可以满足我的需求
  • @jQuerybeast 好吧,看不懂的就不要用了。坦率地说,这个不太好(我可以说我很擅长正则表达式)。
  • 所以您访问了那个网站,但没有选择通过所有项测试的网站?!

标签: javascript jquery regex uri validation


【解决方案1】:
var b = url.substr(url.indexOf('://')+3);

【讨论】:

  • 这将删除 any URL 方案标识符,而不仅仅是 httpshttpftp
  • 在某些情况下,如果 url 本身不包含 http 或 https 会发生什么。
【解决方案2】:

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

我想你只是想要:

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

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

【讨论】:

  • 太棒了。我应该在控制台上测试 protomotach.test() 。谢谢。
【解决方案3】:

如果您想要更通用的方法,例如 Yuri 的方法,但适用于更多情况:

var b = url.replace(/^.*:\/\//i, '');

【讨论】:

    【解决方案4】:

    可能有一个空协议,例如://example.com,因此依赖“://”可能无法涵盖所有​​情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 2018-07-13
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多