2011-09-12 95 views
2

不知道如何形容這一個更好的標題,但這裏是我的問題:比嵌套的if-else更好的解決方案?

我有多個布爾選項的替換功能:

  1. 正則表達式
  2. 整個單詞(僅當正則表達式= = FALSE)
  3. 區分大小寫

,這意味着我必須選擇1 4的方法來取代我的文字。目前我的代碼看起來是這樣的:

(這裏的選擇確實是真/假作爲一個字符串,通過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添加更多選項,則這變得越來越複雜。 有沒有更好或更優雅的方式來寫這個?

+1

我問了一個類似的問題,並得到很好的答案,你可能想看看。 http://stackoverflow.com/questions/7360600/detect-4-permutations-of-2-variable-values-in-a-switch-case-statement –

+0

你爲什麼在第一種情況下使用'preg_replace',而'str_replace '在第二? –

+0

@Evan Cordell:因爲用戶可以在正則表達式和純文本模式之間切換以進行搜索和替換 – iHaveacomputer

回答

1

你可以簡單地做檢查爲$casesens一次,這樣定義一個變量:

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

然後用它在正則表達式模式就像任何其他變量:

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

這將解決第一個if。至於第二個我能想到的2種方式:

  1. 創建類似str_replacestri_replace一個函數,一個額外的boolean變量,忽略大小寫或不和,調用相應的字符串替換功能。
  2. 您可以使用preg_replace代替字符串替換函數,就像您以前所做的一樣,並使用相同的方法解決上述問題。
+0

謝謝,但如果regex == false,我不能使用'preg_replace'而不是'str_replace',因爲我必須以不同的方式處理我的輸入 - 特別是如果用戶嘗試替換html代碼或使用特殊字符,括號等。 – iHaveacomputer

+0

I'米不知道我明白你是問題。但想法是,你可以使用'preg_replace'來模擬與'str_replace'相同的行爲。只需在'$ q'上使用'preg_quote'。這與@Hamish提出的解決方案基本相同。 –

+0

啊;我不知道 :) – iHaveacomputer

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

我不認爲這是優雅的,但至少它的短。

相關問題