2010-10-28 248 views
37

是否允許在PHP開關/ case語句中使用正則表達式以及如何使用它們?switch語句中的正則表達式

+1

你能否通過舉例說明你正在努力完成的事情來澄清這一點嗎? – Adam 2010-10-28 14:16:53

回答

112

的switch-case語句的工作方式如 - ELSEIF。
就像你可以使用if-elseif的正則表達式一樣,你也可以在switch-case中使用它。

if (preg_match('/John.*/', $name)) { 
    // do stuff for people whose name is John, Johnny, ... 
} 

可以被編碼爲

switch $name { 
    case (preg_match('/John.*/', $name) ? true : false) : 
     // do stuff for people whose name is John, Johnny, ... 
     break; 
} 

希望這有助於。

+10

這隻適用於'$ name'評估爲'true'的情況。如果'$ name =='''這會產生錯誤的結果。 -1 – NikiC 2010-10-29 13:19:15

+7

@nikic:你是對的,但是這回答了OP的問題:'PHP開關/ case語句中允許使用正則表達式,以及如何使用它們?' – 2010-10-29 18:26:56

+2

花了我一段時間來理解它的工作原理。我認爲這是一個醜陋的黑客。關鍵是「最」字符串驗證爲真。這個問題的答案是:它在大多數情況下都有效。 – Ezequiel 2013-05-31 15:36:51

12

是的,但你應該使用這種技術來避免出現問題時,開關參數evals到false

switch ($name) { 
    case preg_match('/John.*/', $name) ? $name : !$name: 
    // do stuff 
} 
+0

感謝您的回覆。如果我理解的很好,我可以做'preg_match(「/ regex /」,$ foo)? true:false;'。我不能嗎? – Toto 2010-10-28 15:23:54

+1

這個答案中的第一個例子比所有其他答案都好,因爲它總是正確地匹配(或不)'switch()'的主題,而從'preg_match()'三元組返回true或false可能意外結果,如@ NikiC的空字符串示例。 – Michael 2011-10-24 07:43:19

15

沒有或只有有限的。你可以爲true例如開關:(例如落空)

switch (true) { 
    case $a == 'A': 
     break; 
    case preg_match('~~', $a); 
     break; 
} 

這基本上給你一個if-elseif-else聲明,但語法和switch力量

+0

感謝您的回覆。那麼做一個if-elseif會更好嗎(更具可讀性)? – Toto 2010-10-28 15:21:00

+3

@ M42:如果你不想失敗(不是「打破」),你應該使用if。它更乾淨。 – NikiC 2010-10-28 15:45:25