0

我的开关和 preg_match 案例有问题我的代码是这样的

switch( $WORD ){

    case ( preg_match("/^(?:.+-)?(\d+?)$/i",  $WORD , $ID )  ? true : false ):
        echo "valid ". $ID ." test -> " .preg_match("/^(?:.+-)?(\d+?)$/i",  $WORD );
    break;

    default:
        echo $WORD;
    break;
}

这些代码适用于

$WORD = "TEST";        print => TEST
$WORD = "TEST-1";      print => valid 1 test -> 1
$WORD = "TEST-2552";   print => valid 2552 test -> 1
$WORD = "343";         print => valid 343 test -> 1

但如果$WORD为空或$WORD = ""情况也为真,则打印

$WORD = "";      print => valid  test -> 0

我该如何解决?我试过了

case ( ( preg_match("/^(?:.+-)?(\d+?)$/i",  $WORD , $ID ) == 1 )  ? true : false ):

但不起作用

4

3 回答 3

2

我已经用一个简单的技巧解决了它,所以如果有人有同样的问题,那就是解决它的方法......(目前我不知道是否存在更好的方法)

就在案例之前preg_match添加一个案例case "":

switch( $WORD ){

    default:
    case "":
        // call a function
    break;

    case preg_match("/^(?:.+-)?(\d+?)$/i", $WORD, $ID ) ? true : false:
        echo "valid and id is: ". $ID ;
    break;

    // all other common cases
    case "home":
    case "dog":
    case "cat":
    case "fish":
        // call a function
    break;

    case "bull":
    case "shark":
    case "somethingelse":
        // call a function
    break;
 }
于 2013-01-26T15:08:05.147 回答
0

这不是应该如何switch使用的,我什至不确定它是否可以这样工作。的整个想法switch是对链式语句有一个简短的符号if

if ($foo == 1) { ... }
else if ($foo == 2) { ... }
else if ($foo == 3) { ... }
else { ... }

变成

switch ($foo) {
   case 1: ... break;
   case 2: ... break;
   case 3: ... break;
   default: ...
}

尤其是当您遇到非常复杂的情况时,$foo您可以节省大量重复的代码。在您的情况下,使用switch并没有多大意义。随你去吧if,你很高兴:

if (preg_match("/^(?:.+-)?(\d+?)$/i",  $WORD , $ID )) {
    echo "valid ". $ID ." test -> " .preg_match("/^(?:.+-)?(\d+?)$/i",  $WORD );
} else {
    echo $WORD;
}
于 2013-01-26T14:30:43.973 回答
0

我不明白你为什么使用 switch 来选择布尔值

当 $WORD 为 "" 时,switch($WORD) 等于 switch(false)

那么你的问题就发生了

为什么不

if(preg_match("/^(?:.+-)?(\d+?)$/i",  $WORD , $ID )){
echo "valid ";
}else{
echo $WORD;
}
于 2013-01-26T14:38:07.093 回答