2010-11-14 15 views
18

Estoy usando un modificador PHP para incluir ciertos archivos basados ​​en las palabras clave entrantes pasadas en un parámetro de la URL de la página.Cómo usar una instrucción de cambio de PHP para verificar si una cadena contiene una palabra (pero también puede contener otras)?

La dirección URL, por ejemplo, podría ser: ...page.php?kw=citroen%20berlingo%20keywords

Dentro de la página, me gustaría usar algo como esto:

<? 
    switch($_GET['kw']){ 

     case "berlingo":  
      include 'berlingo.php' 
      break; 
     case "c4": 
      include 'c4.php'; 
      break; 

    } 
?> 

Lo que yo quiero hacer en el primer caso es incluir el archivo berlingo.php si el parámetro de palabra clave contieneberlingo, pero no tiene que ser exactamente esa palabra clave sola.

Por ejemplo, quiero incluir el archivo berlingo.php si la palabra clave es berlingo, pero también si es citroen berlingo.

¿Cómo puedo evaluar si una cadena dada contiene un valor usando una selección de caso de PHP (declaración de cambio)?

Gracias.

Respuesta

0

strpos() es uno para comprobar si una cadena contiene otra cadena.

Hay other functions para comprobar la similitud de cadenas, etc.

Un switch no va a hacer, sin embargo, ya que compara expresiones estáticas contra un solo valor. Tendrás que usar if s.

+0

Core Xii ¿Podrían presentar la versión correcta del interruptor i utilizado con el fin de hacer lo que quiero lograr? Solo intenté reescribir el interruptor usando ese strpos() pero obtuve un error, supongo que no sé cómo hacerlo. – sebastian

1

Puede utilizar la función strpos como:

if(strpos($_GET['kw'],'berlingo') !== false) { 
include 'berlingo.php'; 
} 
if(strpos($_GET['kw'],'c4') !== false) { 
include 'c4.php'; 
} 
+0

¡MALDITO, eso funcionó, eres mi ídolo gracias! – sebastian

5

Dado que en una declaración switch se realizará sólo comprueba la simple igualdad que no le ayudará mucho aquí. Necesita ejecutar la cadena a través de una función de coincidencia de cadenas, la más adecuada de las cuales es strpos. La respuesta directa es:

if (strpos($_GET['kw'], 'berlingo') !== false) { 
    include 'berlingo.php'; 
} else if (strpos($_GET['kw'], 'c4') !== false) { 
    include 'c4.php'; 
} … and so on … 

la solución más elegante sería algo como esto:

$map = array('berlingo' => 'berlingo.php', 'c4' => 'c4.php', …); 
foreach ($map as $keyword => $file) { 
    if (strpos($_GET['kw'], $keyword) !== false) { 
     include $file; 
     break; 
    } 
} 

O, si la correspondencia entre la palabra clave y el archivo es siempre 1: 1:

$keywords = array('berlingo', 'c4', …); 
foreach ($keywords as $keyword) { 
    if (strpos($_GET['kw'], $keyword) !== false) { 
     include "$keyword.php"; 
     break; 
    } 
} 
+0

gracias por su respuesta, ¡ayudó! – sebastian

1
$keywords = array('berlingo', 'c4'); 
foreach($keywords as $keyword) 
    if(strpos($_GET['kw'], $keyword) !== FALSE) 
    include("$keyword.php"); 

Sin embargo, no recomendaría incluir archivos php basados ​​en la entrada del usuario.

+2

Si se compara con una lista blanca, como en este caso no debería haber problemas, incluidos los archivos basados ​​en la entrada del usuario. – deceze

30

Basado en this question y this answer, las soluciones que hemos llegado con (sin dejar de utilizar un caso seleccione) están por debajo.

Puede usar stristr() o strstr(). La razón por la que elegí usar stristr() en este caso es simplemente porque es case-insensible, y por lo tanto, es más robusto.

Ejemplo:

$linkKW = $_GET['kw']; 

switch (true){ 
    case stristr($linkKW,'berlingo'): 
     include 'berlingo.php'; 
     break; 
    case stristr($linkKW,'c4'): 
     include 'c4.php'; 
     break; 
} 

También es posible usar stripos() o strpos() si desea (gracias, Fractaliste), aunque yo personalmente considero esto más difícil de leer. El mismo trato que el otro método anterior; Fui por el caso insensible ruta.

Ejemplo:

$linkKW = $_GET['kw']; 

switch (true){ 
    case stripos($linkKW,'berlingo') !== false: 
     include 'berlingo.php'; 
     break; 
    case stripos($linkKW,'c4') !== false: 
     include 'c4.php'; 
     break; 
} 
+2

Tu idea con 'strpos()': 'cambiar (verdadero) {caso strpos ($ nombre, 'incidente')! == falso:/* El trabajo * /' – Fractaliste

0

sé que esto es mucho después de los hechos, pero sólo como un aparte, siempre se puede evitar por completo el bucle si esperase una relación 1: 1.

Algo a lo largo de las líneas de:

$map = array('berlingo' => 'berlingo.php', 'c4' => 'c4.php', …); 

if(!isset($map[$_GET['kw']])) 
    throw new Exception("Blah!!"); 

include $map[$_GET['kw']]; 

... simplemente compartir su información como para los novatos.

0

También puede utilizar expresiones regulares en el interruptor -> caso:

<?php 

    $kw = filter_input(INPUT_GET, "kw"); 

    switch($kw){ 

     case (preg_match('/*berlingo*/', $kw) ? true : false):  
      include 'berlingo.php'; 
      break; 

     case "c4": 
      include 'c4.php'; 
      break; 

    } 
?> 
Cuestiones relacionadas