【问题标题】:regexp in switch statementswitch 语句中的正则表达式
【发布时间】:2011-05-01 22:04:47
【问题描述】:

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

【问题讨论】:

  • 您能否通过举例说明您要完成的工作来澄清这一点?

标签: php switch-statement


【解决方案1】:

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

变化:

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

收件人:

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

【讨论】:

    【解决方案2】:

    是的,但是当 switch 参数 eval 为 false 时,您应该使用这种技术来避免问题:

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

    【讨论】:

    • 感谢您的回复。如果我理解得很好,我可以做preg_match("/regex/", $foo) ? true : false;。我不能吗?
    • 此答案中的第一个示例优于所有其他答案,因为它将始终正确匹配(或不匹配)switch() 的主题,而从 preg_match() 三元组返回 true 或 false可能会产生意想不到的结果,如@NikiC 的空字符串示例。
    【解决方案3】:

    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;
    }
    

    希望这会有所帮助。

    【讨论】:

    • 这仅在 $name 计算结果为 true 时有效。如果$name == '' 这将产生错误的结果。 -1
    • @nikic:你是对的,但这回答了 OP 的问题:Are regex's allowed in PHP switch/case statements and how to use them ?
    • 我花了一段时间才明白为什么会这样。我认为这是一个丑陋的黑客。关键是“大多数”字符串验证为真。这个问题的答案是:它在大多数情况下都有效。
    • switch $name { case (preg_match('/e*/', $name)): echo "match";break;} 对于 $name = "" 不应该正常工作,因为 preg_match( '/e*', $name) 为真,但为真!= ""。
    • 答案中case中的preg_match()语句可以简化为case (!!preg_match('/John.*/', $name)):
    【解决方案4】:

    没有或只有有限的。例如,您可以切换为 true:

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

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

    【讨论】:

    • 感谢您的回复。那么执行 if-elseif 会更好(更具可读性)吗?
    • @M42:如果你不想失败(不是breaking),你应该使用if。它更干净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多