Лучшее решение, чем вложенное if-else? - PullRequest
2 голосов
/ 12 сентября 2011

Не уверен, как это описать это с лучшим названием, однако вот моя проблема:

У меня есть функция замены с несколькими логическими параметрами:

  1. регулярное выражение
  2. целых слов (только когда регулярное выражение == false)
  3. с учетом регистра

и это означает, что мне нужно выбрать 1 из 4 способов заменить мой текст. В настоящее время мой код выглядит так:

(эти опции действительно являются истиной / ложью как строка, переданная через POST из набора флажков jquery )

    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 в обоих условиях, и это становится все более сложным, если мне нужно добавить больше параметров в пользовательский интерфейс. Есть ли лучший или более элегантный способ написать это?

Ответы [ 3 ]

2 голосов
/ 12 сентября 2011

Что ж, вы, безусловно, можете упростить то, что у вас есть, сократив массу ненужного дублирования, например:

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']);

Я бы не назвал это элегантным, но, по крайней мере, оно короче.

1 голос
/ 12 сентября 2011

Вы можете просто выполнить проверку для $casesens один раз и определить переменную следующим образом:

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

И затем использовать ее в шаблоне регулярных выражений, как и любую другую переменную:

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

Это решило бы первое if.Что касается второго, я могу придумать 2 способа:

  1. Создать функцию, аналогичную str_replace и stri_replace, которая принимает дополнительный логический аргумент, игнорировать регистр или нет и вызывать соответствующийфункция замены строки.
  2. Вы можете использовать preg_replace вместо функций замены строки, как вы это делали ранее, и использовать тот же способ решения проблемы, как я объяснил выше.
0 голосов
/ 12 сентября 2011

Вы можете использовать троичные операторы PHP, чтобы уменьшить сложность

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...