【问题标题】:How to validate a URL via a check constraint in Postgres?如何通过 Postgres 中的检查约束验证 URL?
【发布时间】:2017-03-01 03:05:56
【问题描述】:

这是我尝试过的众多检查表达式之一:

(url::text ~* 'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,255}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)'::text)

这永远不会奏效。

但奇怪的是,这样做(用于电子邮件验证):

(email::text ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$'::text)

我不确定这两个检查表达式之间的区别是什么,但我很想知道。

那么如何通过 Postgres 中的检查约束来验证 URL?

【问题讨论】:

  • 你所说的“从不工作”是什么意思。正在发生什么,您希望发生什么?
  • 一般来说,在验证这样的事情时,最好使用更基本的表达式。像'^https?://'这样的超级简单的东西。否则,将来当您不可避免地发现一个与您的正则表达式不完全匹配的 URL 时,现在您必须进行 schema 更改。如果您可以让您的业务逻辑甚至 UI 层进行此类验证,则最好。还值得注意的是批量插入速度会变慢。
  • @mroach 谢谢!这真的很有帮助。如果 url 不是正确的正则表达式,我期望约束拒绝插入/更新,如果 url 是正确的正则表达式,则接受插入/更新。
  • 我很困惑。你说你想匹配一个 URL,但你给出了一个匹配电子邮件的模式。
  • 退格 (\b) 在 URL 验证模式中的作用是什么? word boundary in PostgreSQL\y(或 \m\M 表示单词的开头和结尾)。此外,如果没有^$,您的正则表达式只会验证输入包含 一个URL,而不是它本身就是一个URL。我还建议您使用比这更简单的模式。但也可以考虑支持IDNs

标签: sql regex postgresql


【解决方案1】:

借助问题下方的评论,我已修复了您的 URL 验证表达式。 所以,只是为了分享:

(website :: text ~* 'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,255}\.[a-z]{2,9}\y([-a-zA-Z0-9@:%_\+.~#?&//=]*)$' :: text)

【讨论】:

  • 我不得不稍微调整一下正则表达式以允许锚点和查询字符串:CREATE DOMAIN url AS text CHECK (VALUE ~ 'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,255}\.[a-z]{2,9}\y([-a-zA-Z0-9@:%_\+.,~#?!&>//=]*)$');
猜你喜欢
  • 2022-11-19
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多