2010-10-28 4 views
37

Разрешено ли регулярное выражение в операторах switch/case PHP и как их использовать?regexp в операторе switch

+1

Можете ли вы прояснить это, представив пример того, что вы пытаетесь выполнить? – Adam

ответ

112

переключателя-саз работает как обсуж- дается ElseIf.
Как вы можете использовать regex для if-elseif, вы также можете использовать его в случае с переключателем.

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

Надеется, что это помогает.

+10

Это работает только тогда, когда '$ name' оценивает значение' true'. Если '$ name == ''' это приведет к неправильным результатам. -1 – NikiC

+7

@nikic: вы правы, но это отвечает на вопрос OP: «Разрешено ли регулярное выражение в операторах PHP/case и как их использовать?» – 2010-10-29 18:26:56

+2

Потребовалось некоторое время, чтобы понять, почему это работает. И я думаю, что это уродливый взлом. Ключ состоит в том, что строки «most» подтверждают true. И ответ на вопрос будет: он работает, в большинстве случаев. – Ezequiel

12

Да, но вы должны использовать эту технику, чтобы избежать проблем, когда переключатель аргумент Evals в false:

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

Спасибо за ваш ответ. Если я хорошо понимаю, я могу сделать 'preg_match ("/regex/", $ foo)? true: false; '. Разве я не могу? – Toto

+1

Первый пример в этом ответе лучше, чем все остальные ответы, потому что он всегда будет правильно соответствовать (или нет) объекту 'switch()', тогда как возвращение true или false из 'preg_match()' trernary может иметь неожиданный результаты, как в примере с пустой строкой @ NikiC. – Michael

15

Нет или только ограниченным. Вы могли бы, например, переключатель для true: (. Например обходя переход)

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

В основном это дает вам if-elseif-else заявления, но с синтаксисом и мощью switch

+0

Спасибо за ваш ответ. Тогда лучше (более читаемо) делать if-elseif? – Toto

+3

@ M42: Если вы не хотите проваливаться (не 'break'ing), вы должны использовать' if'. Это чище. – NikiC

Смежные вопросы