PHP代码点火器转换许多IF';使用正则表达式DRY


PHP Codeigniter convert many IF's with regex DRY

我正在使用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();