为什么switch()不支持正则表达式?

时间:2014-03-07 00:16:17

标签: php regex switch-statement

我对switch()的理解是避免重复字符串。

如果是这样,为什么它不支持正则表达式,如下面的代码?或者我错过了switch()

的观点
switch($username){
  case "":
    array_push($errors, "Username cannot be blank");
    break;
  case "admin":
    array_push($errors, "Username cannot be 'admin'");
    break;
  case regex_switch('/xxx.*/'):
    array_push($errors, "Username cannot begin 'xxx'");
    break;
}

3 个答案:

答案 0 :(得分:5)

switch不是一般条件语句,而是比较值。可以把它想象成扩展到一系列if语句。

例如,考虑以下(伪代码):

switch(a) {
  case x: ... break;
  case y: ... break;
  case z: ... break;
}

扩展到类似:

if (a == x) {
}
elseif (a == y) {
}
elseif (a == z) {
}

所以你的一个案例中的正则表达式最终成为:

if (a == regex_switch(...)) {
}

其中a是字符串......

答案 1 :(得分:0)

因为它没有。故事结束。

经验教训是,您需要想出围绕这种约束的方式,而不是请求PHP开发人员实现某些深奥的功能,并且不会在此过程中完成任何工作。

为什么不:

$disallowed_usernames = array(
  array('/^$/', 'be blank'),
  array('/^admin/', 'begin with "admin"'),
  array('/^xxx/', 'begin with "xxx"'),
);

foreach( $disallowed_usernames as $item ) {
  if( preg_match($item[0], $username) ) {
    array_push($errors, 'Username cannot ' . $item[1]);
    break;
  }
}

答案 2 :(得分:0)

您可以执行以下操作:

switch $username {
  case "":
    array_push($errors, "Username cannot be blank");
    break;
  case "admin":
    array_push($errors, "Username cannot be 'admin'");
    break;
  case (preg_match('/^xxx.*/', $username) ? true : false) :
    array_push($errors, "Username cannot begin 'xxx'");
    break;
}