【问题标题】:Better solution than nested if-else?比嵌套 if-else 更好的解决方案?
【发布时间】:2011-09-12 03:00:37
【问题描述】:

不确定这是如何用更好的标题来描述的,但这是我的问题:

我有一个带有多个布尔选项的替换功能:

  1. 正则表达式
  2. 整个单词(仅当 regex==false 时)
  3. 区分大小写

这意味着我必须从 4 种方法中选择一种来替换我的文本。目前我的代码如下所示:

(这里的那些选项确实是 true/false 作为字符串,通过 POST 从一组 jquery checkboxes 传入)

    if($regex=='true')
    {
        if($casesens=='true')
        {
            $p->aData['body'] = preg_replace('/'.$q.'/', $r, $p->aData['body']);
        }
        else
        {
            $p->aData['body'] = preg_replace('/'.$q.'/i', $r, $p->aData['body']);           
        }
    }
    else
    {
        if($wwords=='true')
        {
            $q = " ".$q." ";
            $r = " ".$r." ";
        }
        if($casesens=='true')
        {
            $p->aData['body'] = str_replace($q, $r, $p->aData['body']);
        }
        else
        {
            $p->aData['body'] = str_ireplace($q, $r, $p->aData['body']);
        }
    }

如您所见,如果必须在两个条件下比较 $casesens,如果我必须向 UI 添加更多选项,这将变得越来越复杂。 有没有更好或更优雅的方式来写这个?

【问题讨论】:

  • 我问了一个类似的问题并得到了很好的答案,你可能想看看。 stackoverflow.com/questions/7360600/…
  • 为什么在第一种情况下使用preg_replace,在第二种情况下使用str_replace
  • @Evan Cordell:因为用户可以在正则表达式和纯文本模式之间切换以进行搜索和替换
  • 在顶级“then”和“else”分支中调用函数并在这些函数中包含简单的 if 有什么问题?

标签: php coding-style if-statement


【解决方案1】:

你当然可以通过减少很多不必要的重复来简化你所拥有的东西,比如:

if(!$regex) $q = preg_quote($q);
elseif($words) $q = "\s{$q}\s/";
$q = "/{$q}/";
if($casesens) $q .= 'i';
$p->aData['body'] = preg_replace($q, $r, $p->aData['body']);

我不会称之为优雅,但至少它更短。

【讨论】:

    【解决方案2】:

    您可以简单地检查一次$casesens 并定义一个像这样的变量:

    if($casesens=='true') {
        $case = 'i';
    }
    

    然后像任何其他变量一样在正则表达式模式中使用它:

    $p->aData['body'] = preg_replace('/'.$q.'/'.$case, $r, $p->aData['body']);
    

    这将解决第一个if。至于第二种我可以想到两种方式:

    1. 创建一个类似于str_replacestri_replace 的函数,它接受一个额外的布尔参数,以忽略大小写,并调用适当的字符串替换函数。
    2. 您可以像以前一样使用preg_replace 代替字符串替换函数,并使用我上面解释的相同方法来解决问题。

    【讨论】:

    • 谢谢,但如果 regex==false,我不能使用 preg_replace 代替 str_replace,因为我必须以不同方式处理我的输入 - 特别是如果用户尝试替换 html 代码或使用特殊字符, 括号等
    • 我不确定我是否理解您的问题。但想法是您可以使用preg_replace 来模拟与str_replace 相同的行为。只需在$q 上使用preg_quote。这与@Hamish 提出的解决方案基本相同。
    【解决方案3】:

    您可以使用 PHP 三元运算符来降低复杂度

    http://davidwalsh.name/php-shorthand-if-else-ternary-operators

    【讨论】:

      猜你喜欢
      • 2013-05-18
      • 2012-05-11
      • 2014-02-03
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多