【问题标题】:Regex URL validation in RubyRuby 中的正则表达式 URL 验证
【发布时间】:2019-05-19 06:25:53
【问题描述】:

我在模型中有以下 ruby​​ 代码:

if privacy_policy_link.match(/#{domain}($|\/$)/) errors.add(:privacy_policy_link, 'Link to a specific privacy policy page on your site instead of your homepage.') end

这一直有效,直到用户尝试保存如下所示的隐私政策链接:

https://example.com/about-me/privacy-policy-for-example-com/

目标是我不希望他们链接到他们的基本主页(example.com 或 www.example.com 等)以获取此隐私政策链接(出于某些随机、复杂的原因,我不会深入探讨)。上面提供的链接应该通过匹配器(这意味着因为它们链接到其网站上的单独页面,所以不应将其视为匹配,并且在保存表单时不应看到任何错误) - 但是因为他们在 url 的后半部分引用了他们的基本域,所以它作为匹配出现。

在我的一生中,我无法弄清楚 rubular 上的正确正则表达式如何让这个 url 通过匹配算法。当然,我不能只要求用户重命名他们的隐私政策链接以在最后删除“com”——因为这样:https://example.com/about-me/privacy-policy-for-example 会通过。 :)

如果有任何帮助可以帮助我了解如何解决此问题,我将不胜感激!

Rubular 链接:http://rubular.com/r/G5OmYfzi6t

【问题讨论】:

  • privacy_policy_link 变量是否包含https://

标签: ruby-on-rails ruby regex rubular


【解决方案1】:

您的问题是. 字符是任何字符,因此它与example-com 中的- 匹配。

如果将其链接到行首,它将正确匹配,而不会尝试转义域中的.

if privacy_policy_link.match(%r{^(http[s]?://|)(www.)?#{domain}($|/$)})

【讨论】:

  • 啊,好吧,这完全有道理!感谢您对此进行解释并提供有效的解决方案。我真的很感激!
  • 小建议 - 为了让您的正则表达式更具可读性,您可以使用%r{},如下所示:%r{^(http[s]?://|)(www.)?#{domain}($|/$)}
猜你喜欢
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 2013-08-24
  • 2011-07-30
  • 2012-03-29
相关资源
最近更新 更多