【问题标题】:URL regexp validation: deny if there isn't 3 W's in URLURL 正则表达式验证:如果 URL 中没有 3 个 W,则拒绝
【发布时间】:2012-03-03 05:52:15
【问题描述】:

我有这个正则表达式来验证 URL:^[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$^。这个正则表达式运行顺利,但我想在 URL 的开头添加一个限制 W 的数量。

如果用户尝试保存小于 3 W 的 URL(例如 ww),则正则表达式将拒绝保存。如果用户尝试保存超过 3 个 W 的 URL(例如 wwww),也会发生相同的结果。

我该如何解决这个问题?

提前致谢。

【问题讨论】:

  • 从您的问题看来,您的用户可以为网址添加书签。但是,有很多网站在没有 www 的情况下宣传其 url。并且工作得很好。 (从技术上讲,拥有这三个 w 的工作量更大;)。您可能希望将此规则重新考虑为“如果 suburl 仅包含 w 并且少于或多于 3 个”。同样在这种情况下,您也会有误报,因为拥有像 ww.example.com 或 w2.example.com 这样的网站是完全有效的。
  • 您是否只想检查它是否以www.(即正则表达式^www\.[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$^)或其他什么开头?
  • 我的错误 - 正则表达式不会拒绝或允许验证,它匹配。我想查看 URL 是否包含“www”,如果包含,请检查此字符串是否正好是 3 个 W,而不是 1 个或 2 个或 4 个或更多。
  • @Erik 在回答中看到我的更新。这种模式是否完全以 www 开头。所以它匹配 www.google.co、google.com 但不匹配 ww.google.com。
  • 在正则表达式中包含www以www开头不一样。

标签: php regex validation url


【解决方案1】:

我认为这种过滤不适合正则表达式。

问题在于“匹配”的规则实际上相当复杂。基本上规则是这样的:

如果有,则匹配:

  • 正文开始
  • 要么:
    • 正好三个w 字符后跟一个点OR
    • 任何重复任意次数的字母数字字符或点,后跟一个点
      • 除非所有这些字符都是 w 字符,但字符数不等于三个(加上点)
  • 两个或三个以上的字母数字字符
  • 正文结束

除非所有这些字符都是 w 字符... 部分是棘手的部分。正则表达式不太适合这项任务。


出于“历史”目的:

使用{n} 将表达式的一部分重复n 次。

^w{3}\.[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?$

使用? 使表达式的一部分成为可选的。

括号是分组运算符。 “w 乘以三”和点在组内移动,并且使用 ? 运算符使组成为可选的。

^Guess what? this doesn't work.$
^I tried to delete the answer but I can't until you unaccept it.$

在这些示例中,我还用反斜杠转义了最后一个正斜杠,因为正则表达式通常用 / 字符分隔。如果你不需要它,你可以删除它。

【讨论】:

  • 谢谢!但我也想匹配没有 www.
  • 谢谢,但根据 regexpal.com,它不匹配任何没有 www 的 URL。 ://
  • 是的,我忘了? :p 再检查一遍
  • 嗯。它似乎匹配任何长度的 www :/
  • 我认为最好用explode来做。
猜你喜欢
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 2013-08-24
  • 2011-07-30
  • 1970-01-01
相关资源
最近更新 更多