为regex_match表单验证规则(Form validation rules for regex

2019-07-17 11:12发布

我试图找出我在做什么错,这个验证规则,因为它说这个错误。

验证规则:

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

错误:

严重性:警告
消息:的preg_match()[function.preg匹配]:定界符不能是字母数字或反斜线

Answer 1:

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

它需要有一个分隔符包围它,所以像/a-z0-9/ (如果你有使用反斜线作为分隔符的笨问题,你有一些其他的选项:参见上PCRE定界符手册页 )

现在,你有字面上的字符串相匹配的模式a-z0-9在它的某个地方。 请注意,如果你想匹配的字符类,您就需要再次包住它在括号使它的是,这么/[a-z0-9]/

现在,我会认为你其实是想检查整个字符串为(小写)字母,而不仅仅是它有一个字符匹配。 在你需要一个正面锚固件这种情况下,你的字符类匹配,重复修改(我会假设你不希望匹配一个空字符串,使其一个或多个),然后锚指定比赛必须延伸到端:

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

你甚至可以设定的最小长度由用于加代括号和提供最小值,最大值(离开最大出来,以允许它超过任何分钟长度)...例如/^[a-z0-9]{3,}$

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

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

除了这实际上不会笨显然工作(如2011年3月是这种情况无论如何),因为它是如何处理的验证规则括号内,所以你需要使用一个回调( 见这里 )。

使用回调 :

您会将类似下面的功能在你的控制器(或以其他方式适当的范围内):

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 。 请注意,如果你扩展表单验证,你不需要用你的附加功能callback_当你引用它set_rules

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

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


该替代路线是修改的form_validation规则使用笨自己的模式匹配。 到Ellislab论坛的链接描述了问题,然后解决它的潜在方法进一步下跌的线程 。 从在笨代码并指定了修复一眼,他们提供可以打破规则使用数组所提出的解决方案:一个更好的正则表达式使用递归的匹配会解决这两个取代一个在笨的功能,但可能会在较重遇到性能问题规则。

笨的图案为规则form_validation匹配在其系统/库/ Form_validation.php文件中找到,在线路115的2.1.3。



Answer 2:

PHP的的preg_match需要您的正则表达式由非字母数字字符包围(通常是每个人都使用/),改变你的setRules()这样的:

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


文章来源: Form validation rules for regex_match