在switch语句中使用regexp

Tot*_*oto 46 php switch-statement

PHP switch/case语句中是否允许使用regex以及如何使用它们?

小智 131

switch-case语句的作用类似于if-elseif.
除了你可以使用if-elseif的正则表达式,你也可以在switch-case中使用它.

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

可以编码为

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

希望这可以帮助.

  • 这仅在`$ name`求值为'true`时有效.如果`$ name ==''`这将产生错误的结果.-1 (11认同)
  • @nikic:你说得对,但是这回答了OP的问题:`PHP开关/ case语句中是否允许正则表达式以及如何使用它们? (9认同)
  • 切换为真是太多waaaayyy凉爽 (3认同)
  • 我花了一段时间才明白为什么会这样.我认为这是一个丑陋的黑客.关键是"大多数"字符串验证为真.这个问题的答案是:大部分时间都有效. (2认同)
  • 答案中`case`中的`preg_match()`语句可以简化为`case (!!preg_match('/John.*/', $name)):` (2认同)

Nik*_*kiC 16

没有或只有限.例如,您可以切换true:

switch (true) {
    case $a == 'A':
        break;
    case preg_match('~~', $a);
        break;
}
Run Code Online (Sandbox Code Playgroud)

这基本上给你一个if-elseif-else声明,但有语法和可能switch(例如,直通).

  • @ M42:如果你不想要通过(不是'break`ing),你应该使用`if`.它更清洁. (4认同)

Orb*_*bit 15

是的,但是你应该使用这种技术来避免在switch参数变为false:

switch ($name) {
  case preg_match('/John.*/', $name) ? $name : !$name:
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)


S. *_*Dre 5

请记住,上面的答案可以像这样稍微优化:

改变:

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

到:

switch $name {
    case (bool)preg_match('/John.*/', $name) :
        // do stuff for people whose name is John, Johnny, ...
        break;
}
Run Code Online (Sandbox Code Playgroud)