【问题标题】:Rails validating full_nameRails 验证 full_name
【发布时间】:2010-04-13 12:23:57
【问题描述】:

嘿...您将如何验证 full_name 字段(姓氏)。

【问题讨论】:

  • 需要一些好的 reg 用于 validates_format_of
  • 什么是可接受的值,什么不是?在我看来,您只能检查,不应该有任何特殊字符,如 #@%...、数字,并且应该至少有 1 个空格。
  • 有些人只有一个名字,所以即使是寻找一个空格也可能有问题。问问自己:为什么我要验证名称字段?您想防止发生什么问题?

标签: ruby-on-rails validation validating


【解决方案1】:

考虑以下名称:

  • 女士扬·莱文森-古尔德
  • 博士。小马丁路德金
  • Brett d'Arras-d'Haudracey
  • 布鲁诺

您可能只想确保某些字符集不存在,而不是验证那里的字符。

例如:

class User < ActiveRecord::Base

  validates_format_of :full_name, :with => /\A[^0-9`!@#\$%\^&*+_=]+\z/
  # add any other characters you'd like to disallow inside the [ brackets ]
  # metacharacters [, \, ^, $, ., |, ?, *, +, (, and ) need to be escaped with a \

end

测试

Ms. Jan Levinson-Gould         # pass
Dr. Martin Luther King, Jr.    # pass
Brett d'Arras-d'Haudracey      # pass
Brüno                          # pass
John Doe                       # pass
Mary-Jo Jane Sally Smith       # pass
Fatty Mc.Error$                # fail
FA!L                           # fail
#arold Newm@n                  # fail
N4m3 w1th Numb3r5              # fail

正则表达式解释

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  \A                       the beginning of the string
--------------------------------------------------------------------------------
  [^`!@#\$%\^&*+_=\d]+     any character except: '`', '!', '@', '#',
                           '\$', '%', '\^', '&', '*', '+', '_', '=',
                           digits (0-9) (1 or more times (matching
                           the most amount possible))
--------------------------------------------------------------------------------
  \z                       the end of the string

【讨论】:

  • 我在 Rails 4.0.1 上发现了这个问题 提供的正则表达式使用了多行锚(^ 或 $),这可能会带来安全风险。您是要使用 \A 和 \z,还是忘记添加 :multiline => true 选项?但是通过添加 :multiline => true validates_format_of :name, :with =&gt; /^[^0-9`!@#\$%\^&amp;*+_=]+$/, :multiline =&gt; true 解决了
  • @barek2k2,我应该在这里使用\A 和\z。感谢您的评论。
  • 虽然有点晚了...但是请记住,此正则表达式认可名称为 ------
  • 考虑非英语使用者(西里尔文等名称)。真是一团糟。
【解决方案2】:

您在此处执行的任何验证都可能会失败,除非它非常笼统。例如,在不详细说明输入内容的情况下,强制执行最小长度 3 可能是尽可能合理的。

当您的名字如“O'Malley”带有撇号、“Smith-Johnson”带有破折号、“Andrés”带有重音字符或极短的名字(如“Vo Ly”几乎没有字符时,如何您是否在不排除合法案例的情况下进行验证?这并不容易。

【讨论】:

    【解决方案3】:

    至少一个空格和至少4个字符(包括空格)

    \A(?=.* )[^0-9`!@#\\\$%\^&*\;+_=]{4,}\z
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多