2010-10-28 16 views
37

¿Están permitidos los regex en las sentencias de cambio/caso de PHP y cómo usarlos?regexp en la instrucción switch

+1

¿Puede aclarar esto dando un ejemplo de lo que está tratando de lograr? – Adam

Respuesta

112

declaración switch de los casos funciona como si- elseif.
Además de usar regex para if-elseif, también puede usarlo en la caja del conmutador.

if (preg_match('/John.*/', $name)) { 
    // do stuff for people whose name is John, Johnny, ... 
} 

se pueden codificar como

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

Espero que esto ayude.

+10

Esto solo funciona cuando '$ name' se evalúa como' true'. Si '$ name == ''' esto arrojará resultados incorrectos. -1 – NikiC

+7

@nikic: tienes razón, pero esto responde a la pregunta del OP: '¿Están permitidas las expresiones regulares en las declaraciones del interruptor/caso de PHP y cómo usarlas?' –

+2

Me tomó un tiempo entender por qué funciona esto. Y creo que es un hack feo. La clave es que las "más" cadenas validan a verdadero. Y la respuesta a la pregunta sería: funciona, la mayoría de las veces. – Ezequiel

12

Sí, pero debe utilizar esta técnica para evitar problemas cuando el interruptor de argumentos evals a false:

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

Gracias por su respuesta. Si lo entiendo bien, puedo hacer 'preg_match ("/regex/", $ foo)? true: falso; '. ¿No puedo? – Toto

+1

El primer ejemplo en esta respuesta es mejor que todas las demás respuestas porque siempre coincidirá (o no) correctamente con el asunto del 'interruptor()', mientras que devolver verdadero o falso desde el ternario 'preg_match()' podría ser inesperado resultados, como en el ejemplo de cadena vacía de @ NikiC. – Michael

15

ninguna o sólo limitada. Usted podría, por ejemplo, el interruptor de true: (., Por ejemplo, caer a través)

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

Básicamente, esto le da una declaración if-elseif-else, pero con la sintaxis y la fuerza de switch

+0

Gracias por su respuesta. Entonces, ¿es mejor (más legible) hacer un if-elseif? – Toto

+3

@ M42: si no quiere que se caiga (al no 'romper') debe usar 'si'. Es más limpio. – NikiC

Cuestiones relacionadas