【问题标题】:URLs starting with http:// or https://, separated by comma, no spaces以 http:// 或 https:// 开头的 URL,以逗号分隔,没有空格
【发布时间】:2018-10-08 14:11:05
【问题描述】:

我需要检查用户插入 URL 的字段。规则是:

  • 没有空格;
  • 以逗号分隔;
  • 每个 URL 必须以 http:// 或 https:// 开头

输入文本的有效示例:

一些无效的例子:

这是我的正则表达式,但不能正常工作:

/(^([\S]https?:\/\/)\w+(?:\.\w+)*\.\w{2,})$*/i

【问题讨论】:

  • 什么工作不正常?
  • 你想和[\S]https 中的\S 匹配什么?您正在匹配任何非空白字符,但我认为 http 将是字符串的开头。最重要的是,你正试图捕捉它。
  • 嗨@UweKeim,根据规则,匹配的网址无效。例如:“htt://test.com,blahblahblah.com”
  • @K.Dᴀᴠɪs,独立于删除 \S,它不起作用。我刚刚分享了最后一次尝试。

标签: javascript regex


【解决方案1】:

您的实际正则表达式不正确,因为当您在正则表达式的开头使用[\S]https 时,它接受http 之前的任何非空白字符。

我可以建议将Array 函数与此regex 结合使用,以确保所有输入的网址都正确。

先用逗号分割输入值,得到urls数组:

var urls = document.getElementById("urls").value.split(",");
urls = urls.map(u => u.trim()).filter(v => v !== '');

然后检查所有 url 是否与 /^https?:\/\/(\w+)\.\[a-z\]{2,3}$/ 匹配 regex

let valid = urls.every(url => url.match(/^https?:\/\/(\w+)\.[a-z]{2,3}$/));

演示:

document.getElementById("urls").onchange = function() {
  var urls = document.getElementById("urls").value.split(",");
  urls = urls.map(u => u.trim()).filter(v => v !== '');
  console.log(urls);
  let valid = urls.every(url => url.match(/^https?:\/\/(\w+)\.[a-z]{2,3}$/) );
  console.log(valid);
}
<input id="urls" />

【讨论】:

  • 谢谢@chŝdk。它似乎在大多数情况下都有效。但是当允许空格时失败。我认为一个小的调整就足够了。 ;)
  • @VitorEduardodaSilva 请看看我使用this regex编辑的代码。
【解决方案2】:

你可以试试这样的:

^(?:https?:\/\/\w+\.\w+,?)*$

这是非常基本的,不提供广泛的 url 验证,例如拼写错误的顶级域(.com 与 .cmo)。

只需捕获您的模式https?:\/\/\w+\.\w+,?根据需要递归(?1)允许可选的逗号,

See it here

【讨论】:

  • 在我看来这是有史以来最好的。但是JS不支持这种风格。
  • 啊,你是对的。实际上,您甚至根本不需要递归第一个捕获组-我在测试某些东西时将它放在了那里,但后来忘记了将其删除。你可以使用^(https?:\/\/\w+\.\w+,?)*$
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多