【问题标题】:url validation RegExp recognize email address as urlurl 验证 RegEx 将电子邮件地址识别为 url
【发布时间】:2015-10-11 07:49:27
【问题描述】:

我必须在某些文本中识别 url。 我使用以下代码(this.value 是文本):

if (new RegExp("([a-zA-Z0-9]+://)?([a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?([a-zA-Z0-9.-]+\\.[A-Za-z]{2,4})(:[0-9]+)?(/.*)?").test(this.value)) {
    alert("url inside");
}

将电子邮件地址也识别为 url 的问题。 如何预防?

【问题讨论】:

  • 该正则表达式将只匹配某些 URI(例如,本地/实验协议应以“x-”开头)。如果您不想匹配所有协议,了解您想要匹配哪些协议会有所帮助?
  • @Richard- 我想要匹配所有协议
  • mailto: 是一个有效的匹配......或者你不应该将协议设为可选?
  • @Richard- 协议应该只匹配 url,而不是电子邮件地址
  • “我想要匹配所有协议”“不匹配电子邮件地址”---所以做出决定,全部还是不?所有的字面意思是全部

标签: javascript regex url-validation


【解决方案1】:

表达式/[a-zA-Z0-9_]//\w/i 相同。

原始正则表达式匹配文本中的“domain.org”子字符串,例如“text name@domain.org text mailto:name@domain-2.org text”。要解决此问题,请在 RegExp 的开头添加 (?:^|[^@\.\w-]) - 子字符串应位于行首或不应以字符 '@'、'.'、'-'、'\w' 开头。

要排除“mailto:user@...”子字符串,应修改表达式([a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?。因为 Javascript RegExp 没有后视表达式,所以排除“mailto”的唯一方法是使用前瞻表达式\w(?!ailto:)\w+:,但所有子字符串都像“[a-zA-Z0-9_]ailto:...@。 .." 也将被排除在外。

要从“text user.name@domain.org text”之类的文本中排除匹配的子字符串“user.name”,请在 RegExp 的末尾添加表达式 (?=$|[^@\.\w-]) - 仅当行跟随子字符串或以下字符'@'、'.'、'-'、'\w'不跟随子字符串。

var re = /(?:^|[^@\.\w-])([a-z0-9]+:\/\/)?(\w(?!ailto:)\w+:\w+@)?([\w.-]+\.[a-z]{2,4})(:[0-9]+)?(\/.*)?(?=$|[^@\.\w-])/im;

//if (re.test(this.value)) {
//    alert("url inside");
//}

var s1 = "text name@domain.org name.lastname@domain-2.org text mailto:user.name@domain-3.org text";
if (re.test(s1)) {
    alert("Failed: text without URL");
}

var s2 = "text http://domain.org/ text";
if (!re.test(s2)) {
    alert("Failed: text with URL");
}

alert("OK");

【讨论】:

  • 请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为何能解决问题的说明。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
猜你喜欢
  • 2017-09-15
  • 1970-01-01
  • 2011-11-20
  • 2011-10-28
  • 2014-06-12
  • 1970-01-01
  • 2020-08-08
  • 2013-12-22
  • 2018-03-13
相关资源
最近更新 更多