Php switch语句中的regexp

Php switch语句中的regexp,php,switch-statement,Php,Switch Statement,PHP switch/case语句中是否允许使用正则表达式,以及如何使用它们?是的,但是当switch参数求值为false时,应该使用此技术来避免出现问题: switch ($name) { case preg_match('/John.*/', $name) ? $name : !$name: // do stuff } 没有或仅有限。例如,您可以切换为true: switch (true) { case $a == 'A': break; cas

PHP switch/case语句中是否允许使用正则表达式,以及如何使用它们?

是的,但是当switch参数求值为
false时,应该使用此技术来避免出现问题:

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

没有或仅有限。例如,您可以切换为
true

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

这基本上为您提供了一个
if-elseif-else
语句,但带有
switch
的语法和可能(例如fall-through)。

switch-case语句的工作原理与if-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;
}

希望这能有所帮助。

你能举例说明你正在努力实现的目标吗?谢谢你的回答。那么做if-elseif是否更好(更具可读性)?@M42:如果你不想失败(通过不
break
ing),你应该使用
if
。更干净。谢谢你的回复。如果我理解得好,我可以做
preg\u匹配(“/regex/”,$foo)?真:假。我不能吗?这个答案中的第一个例子比所有其他答案都好,因为它总是正确匹配(或不匹配)开关()的主题,而从
preg\u match()返回true或false可能会产生意外的结果,如@NikiC的空字符串示例中所示。这仅在
$name
计算结果为
true
时有效。如果
$name=''
这将产生错误的结果-1@nikic:你是对的,但这回答了OP的问题:
在PHP switch/case语句中是否允许使用regex,以及如何使用它们?
花了我一段时间才理解为什么会这样。我认为这是一个丑陋的黑客。关键是“大多数”字符串验证为true。这个问题的答案是:它在大多数情况下都是有效的。switch$name{case(preg_-match('/e*/',$name)):echo“match”;break;}不应该对$name=”“正确工作,因为preg_-match('/e*',$name)是真的,但却是真的!=“”。答案中的
case
中的
preg\u match()
语句可以简化为
case(!!preg\u match('/John.*/',$name)):