【问题标题】:Form validation rules for regex_matchregex_match 的表单验证规则
【发布时间】:2012-12-21 00:13:59
【问题描述】:

我正试图找出我在使用此验证规则时做错了什么,因为它说这个错误。

验证规则:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[a-z0-9]');

错误:

严重性:警告
消息:preg_match() [function.preg-match]:分隔符不能是字母数字或反斜杠

【问题讨论】:

标签: php codeigniter


【解决方案1】:

首先,您需要修复您的模式。你现在的模式是a-z0-9

它需要有一个分隔符来包围它,比如/a-z0-9/(如果您在使用反斜杠分隔符的 Codeigniter 中遇到问题,您还有许多其他选择:请参阅 The manual page on PCRE delimiters

现在你有一个模式,它与其中某个位置的 a-z0-9 字符串匹配。请注意,如果您尝试将其作为字符类进行匹配,则需要再次将其括在括号中以使其匹配,因此 /[a-z0-9]/

现在我将假设您实际上想要检查整个字符串是否是(小写的)字母数字,而不仅仅是它有一个与之匹配的字符。在这种情况下,您需要一个前锚、要匹配的字符类、一个重复修饰符(我假设您不想匹配一个空字符串并使其成为一个或多个),然后是一个用于指定匹配的锚必须延伸到最后:

/^[a-z0-9]+$/

您甚至可以通过用大括号代替加号并提供最小值、最大值来设置最小长度(将最大值留出以允许其长度超过最小值)...例如/^[a-z0-9]{3,}$

所以你的第三个参数最终看起来像:

'trim|required|xss_clean|regex_match[/^[a-z0-9]+$/]'

除了这实际上在 codeigniter 中显然不起作用(截至 2011 年 3 月无论如何都是这种情况),因为它如何处理验证规则中的括号,所以你需要使用回调 (see here)。

使用callback:

您可以在您的控制器(或其他适当的范围)中放置如下函数:

public function _usernameRegex($userName) {
  if (preg_match('/^[a-z0-9]+$/', $userName ) ) 
  {
    return TRUE;
  } 
  else 
  {
    return FALSE;
  }
}

然后你设置规则来调用你的函数:

set_rules('username', 'Username', 'trim|required|xss_clean|callback__usernameRegex');

注意:如果您在控制器中创建回调函数,则该函数以前导下划线命名,以防止 url 访问。有另一种方法可以通过创建一个扩展CI_Form_validation 类的类来做到这一点,但这似乎是一个更复杂的解决方案。如果您使用前导下划线命名函数,请记住您必须将其包含在规则中,这导致callback__usernameRegex 总共有两个下划线:一个用于callback_ 的前缀,第二个用于对于函数的名称,_usernameRegex。这可能非常简单,不需要向您指出,但在我看来,这似乎很容易被忽略。有关扩展CI_Form_validation 的详细说明,请参阅Adding custom callback to Codeigniter Form Validation 的链接答案。请注意,如果您扩展表单验证,当您在 set_rules 中引用您的函数时,您不需要附加 callback_

您还可以为新回调设置消息:

$this->form_validation->set_message('usernameRegex', 'The %s field must only contain lowercase letters and/or numbers');


另一种方法是修改 Codeigniter 自己的用于 form_validation 规则的模式匹配。 Ellislab 论坛的链接描述了该问题以及解决该问题的潜在方法further down the thread。通过查看 Codeigniter 代码和指定的修复程序,他们提供的建议解决方案可能会破坏在规则中使用数组:通过使用递归匹配替换 Codeigniter 函数中的一个更好的正则表达式可以解决这两个问题,但可能会遇到更重的性能问题规则。

Codeigniter 的 form_validation 规则模式匹配可在其 system/libraries/Form_validation.php 文件中找到,该文件位于 2.1.3 的第 115 行。

【讨论】:

  • 您需要将 / 放在 [] 内,因为 codeigniter 期望正则表达式被 [] 包围。
  • 这是一个很好的问题,我在参考 codeigniter 的工作方式方面犯了错误 =) 现在应该修复
  • 很好地抓住了实际的正则表达式不在字符类中
  • 这不对吗? 'trim|required|xss_clean|regex_match[/[a-z0-9]/]'
  • 你可以试试(我没有安装 codeigniter 来测试)但根据ellislab.com/forums/viewthread/185601 它可能会失败,在这种情况下你需要实现回调。那是去年写的,所以也许他们已经修复了验证模式匹配,以正确处理包含在其他括号中的括号
【解决方案2】:

使用下面的代码在我的最后工作正常

$this->form_validation->set_rules('username', 'Username','trim|required|callback_username_check|regex_match[/^[a-z0-9]+$/]');

【讨论】:

    【解决方案3】:

    php 的 preg_match 希望你的正则表达式被一个非字母数字字符包围(通常每个人都使用 /),将你的 setRules() 更改为:

    $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[/a-z0-9/]');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多