我正在使用CI最新版本构建一个应用程序。我的问题是我有一长串正则表达式,比如:
$regex1 = "/.../";
$regex2 = "/.../";
...
$regexn = "/.../";
我需要为每个正则表达式传递一个if语句,如下所示:
if(preg_match($regex1, $input)){
$data['result'] = $this->Model1->get_text();
}
if(preg_match($regex2, $input)){
$data['result'] = $this->Model2->get_text();
}
...
这东西很管用,但我讨厌看到所有的if都在那里。我的问题是如何以任何方式缩短它,并使其在CI 中更易于维护
使用数组循环遍历每种可能性,尽管此示例依赖于您的模型实际命名为Model1
的想法。。Model2
(很抱歉,如果这只是一个例子,否则请替换型号名称、ModelAdmin => $regex1
等的编号键)
$Regexes = array(
0 => $regex1,
1 => $regex2,
//etc
);
foreach( $Regexes as $Key => $Regex ) {
if( preg_match( $Regex, $input )) {
$Model = "Model" . $Key;
$data['result'][] = $this->$Model->get_text();
}
}
此外,在$data['result']
的末尾添加了一个[]
,否则它将覆盖以前的"结果"
您是否考虑过使用switch而不是if语句?这不会有太大的区别,但在有很多选择的情况下,切换通常是更好的选择。
例如:
switch $data['result'] {
case (preg_match($regex1, $data['result']) ? true : false):
$data['result'] = $this->Model1->get_text();
break;
case (preg_match($regex2, $data['result']) ? true : false):
$data['result'] = $this->Model2->get_text();
break;
}
这可以在一个preg_filter函数调用中完成:
// array of regex patterns
$patterns = array($regex1, $regex2, $regex3);
// preg_filter will return null (supplied as 2nd argument) if all REs fail to match
if ( preg_filter($patterns, null, $input) )
$data['result'] = $this->$Model->get_text();