regex_match的表单验证规则

时间:2012-12-21 00:13:59

标签: php codeigniter

我试图弄清楚我对此验证规则做错了什么,因为它说出了这个错误。

验证规则:

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

错误:

  

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

3 个答案:

答案 0 :(得分:13)

首先,您需要修复您的模式。您现在的模式是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总共有两个下划线:一个用于前缀{{1} }和第二个函数名称callback_。这可能完全是直截了当的,不需要向你指出,但对我来说,它似乎很容易被遗漏。有关扩展_usernameRegex的详细说明,请参阅Adding custom callback to Codeigniter Form Validation的关联答案。请注意,如果您扩展表单验证,则在CI_Form_validation中引用该函数时,无需使用callback_附加函数。

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

set_rules


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

codeigniter的form_validation规则的模式匹配可以在其system / libraries / Form_validation.php文件中找到,在第115行,自2.1.3开始。

答案 1 :(得分:1)

使用以下代码在我看来可以正常工作

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

答案 2 :(得分:0)

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

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