Ruby 中的正则表达式 URL 验证

3

我在一个模型中有以下的Ruby代码:

if privacy_policy_link.match(/#{domain}($|\/$)/) errors.add(:privacy_policy_link, '链接到您网站上特定的隐私政策页面,而不是主页。') 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

2
“privacy_policy_link” 变量是否包含 “https://”? - Ho Man
1个回答

2

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

如果将其链接到行的开头,则可以正确匹配而无需尝试转义域中的.

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

啊,好的,那样就完全有意义了!谢谢你解释这个问题并提供一个可行的解决方案。我非常感激! - pixelcandy
1
小建议 - 为了使您的正则表达式更易读,您可以使用%r{},如下所示:%r{^(http[s]?://|)(www.)?#{domain}($|/$)} - John Gallagher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接