正则表达式验证网址不能正常工作

时间:2013-11-19 18:16:51

标签: regex

我找到了以下模式来验证网址here

/\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i;

作者对此正则表达式的解释是:

(?xi)
\b
(                       # Capture 1: entire matched URL
  (?:
    https?://               # http or https protocol
    |                       #   or
    www\d{0,3}[.]           # "www.", "www1.", "www2." … "www999."
    |                           #   or
    [a-z0-9.\-]+[.][a-z]{2,4}/  # looks like domain name followed by a slash
  )
  (?:                       # One or more:
    [^\s()<>]+                  # Run of non-space, non-()<>
    |                           #   or
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\)  # balanced parens, up to 2 levels
  )+
  (?:                       # End with:
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\)  # balanced parens, up to 2 levels
    |                               #   or
    [^\s`!()\[\]{};:'".,<>?«»“”‘’]        # not a space or one of these punct chars
  )
) 

问题是,如果我输入www.ab这个正则表达式并且说这是一个有效的网址,我想要的是这个网址必须有2个最后部分:“ foobar ” + + (至少2个字符),那么我如何修改此Regex以匹配我需要的内容?

2 个答案:

答案 0 :(得分:3)

您最初表示您希望正则表达式与三部分网址匹配:www,域名和最少2个字符的TLD。那将是:

(https?://)?[^.]+\.[^.]+\....*

我在这里使用点来处理域和TLD中的数字和非拉丁字符的情况。

如果您想支持一个或多个子域,我们可以使该正则表达式更通用。考虑:

(https?://)?([^.]+\.)+...*

这仍然与www.ab匹配 - 根据“domain”+“”的规范,这是一个“有效”的URL。 +“tld”(最少两个字符)。它也符合www.45,但您没有规定使TLD有效的原因。

所以最终考虑关注一些sage advice

  

哪个...你应该使用正则表达式?这真的取决于   在你想要做什么。在许多情况下,答案可能是   根本不使用任何正则表达式。只需尝试解析URL。   如果它返回有效内容,请接受它。如果你得到404或其他   错误,拒绝它。最终,这是唯一真正的考验,看看是否   网址有效

答案 1 :(得分:0)

/\bwww\.\w+\.\w{2,}/

这将匹配www.any_alfa_numeric_combo.two_or_more_alfa_nemeric