Rails4:模型验证 slug 列的“格式”正则表达式

Posted

技术标签:

【中文标题】Rails4:模型验证 slug 列的“格式”正则表达式【英文标题】:Rails4 : model validates "format with" regex for slug column 【发布时间】:2016-06-30 12:42:10 【问题描述】:

我的模型有带有友好 ID gem 的 slug,有时用户只输入数字 slug 并且在访问页面时遇到问题。 然后我想更改模型验证,除了只有数字和一些特殊字符。

这是当前验证的模型

validates :slug, presence: true, length:  maximum: 200 , uniqueness: true,
        format: with: /\A[^\s!#$%^&*()()=+;:'"\[\]\\|\\\/<>?,]+\z/, message: :invalid_slug

如何在此处添加??

示例:

当前:

'123' => valid
'abc' => valid
'adb?&' => invalid

新:

'123' => invalid
'abc' => valid
'adb?&' => invalid

干杯

【问题讨论】:

您想在 slug 中包含所有特殊字符(除了 ? 和 &)还是只包含下划线和连字符? 如何从输入中生成 slug?为什么在生成 slug 时不处理这种情况? 所以,只需将数字添加到否定字符类:/\A[^0-9\s!#$%^&amp;*()()=+;:'"\[\]\\|\\\/&lt;&gt;?,]+\z/ - 这不是您需要的吗?或者您是否想允许数字 + 其他内容并希望禁止仅数字的 slug?然后使用/\A(?!\d+\z)[^\s!#$%^&amp;*()()=+;:'"\[\]\\|\\\/&lt;&gt;?,]+\z/ 【参考方案1】:

当前正则表达式:

/\A[^\s!#$%^&*()()=+;:'"\[\]\\|\\\/<>?,]+\z/

匹配任何仅包含 1+ 个符号的字符串,而不是在 否定字符类 [^...] 中指定的符号。因此,由于没有数字,因此字符串中允许使用数字,并且可以有 1 个以上的数字,并且正则表达式将匹配该仅数字的 slug。

要限制此模式以排除匹配的仅限数字的 slug,只需在 \A 锚之后添加一个 (?!\d+\z) 前瞻:

/\A(?!\d+\z)[^\s!#$%^&*()()=+;:'"\[\]\\|\\\/<>?,]+\z/
   ^^^^^^^^^

查看regex demo(多行,因此,使用^ / $ 锚点,您需要在ROR 中使用\A\z

此先行将在字符串的开头执行一次,当它断言(=匹配)直到字符串末尾的数字(1 个或更多)时,将返回 false。

【讨论】:

以上是关于Rails4:模型验证 slug 列的“格式”正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5 中更新具有唯一列的模型

在 Django 中验证 slug

自定义 Django SlugField 验证会破坏 URL 匹配

获取正则表达式以解析表格列的xml格式数据

Coldfusion 正则表达式生成 slug

urlpattern 的正则表达式