2010-10-28 161 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