微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – regex_match的表单验证规则

我试图弄清楚我在验证规则上做错了什么,因为它说这个错误.

验证规则:

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

错误

Severity: Warning
Message: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash

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

它需要有一个分隔符,所以像/ a-z0-9 /(如果你在Codeigniter中使用反斜杠分隔符有问题,你有许多其他选项:见The manual page on PCRE delimiters)

现在你有一个模式,字面上匹配一个字符串,其中包含一个-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','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’,’%s字段必须只包含小写字母和/或数字’);

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

对于form_validation规则,Codeigniter的模式匹配可以在其系统/ libraries / Form_validation.PHP文件中找到,在第115行中从2.1.3开始.

原文地址:https://www.jb51.cc/php/133159.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐