不确定这是如何用更好的标题来描述的,但是这是我的问题:
我有一个带有多个布尔选项的替换函数:
这意味着我必须选择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添加更多选项,这将变得越来越复杂。
是否有更好或更优雅的方式来写这个?
答案 0 :(得分:2)
你可以通过减少大量不必要的重复来简化你所拥有的东西,例如:
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 :(得分:1)
您只需检查一次$casesens
并定义一个如下变量:
if($casesens=='true') {
$case = 'i';
}
然后在正则表达式模式中使用它,就像任何其他变量一样:
$p->aData['body'] = preg_replace('/'.$q.'/'.$case, $r, $p->aData['body']);
这将解决第一个if
。至于第二个,我可以想到两种方式:
str_replace
和stri_replace
的函数,它接受一个额外的布尔参数,忽略大小写,并调用相应的字符串替换函数。preg_replace
代替字符串替换函数,并使用相同的方法解决问题,如上所述。答案 2 :(得分:0)
您可以使用PHP三元运算符来降低复杂性
http://davidwalsh.name/php-shorthand-if-else-ternary-operators