2010-11-14 14 views
18

J'utilise un commutateur PHP pour inclure certains fichiers basés sur les mots clés entrants passés dans un paramètre de l'URL de la page.Comment utiliser une instruction switch PHP pour vérifier si une chaîne contient un mot (mais peut en contenir d'autres)?

L'URL, par exemple, pourrait être: ...page.php?kw=citroen%20berlingo%20keywords

l'intérieur de la page, je voudrais utiliser quelque chose comme ceci:

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

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

    } 
?> 

Ce que je veux faire dans le premier cas est inclure le fichier berlingo.php si le mot-clé paramètre contientberlingo, mais il ne doit pas être exactement ce seul mot-clé.

Par exemple, je veux inclure le fichier berlingo.php si le mot clé est berlingo, mais aussi si elle est citroen berlingo.

Comment puis-je évaluer si une chaîne donnée contient une valeur en utilisant une sélection de cas PHP (instruction switch)?

Merci.

Répondre

0

strpos() est un pour vérifier si une chaîne contient une autre chaîne.

Il y a other functions pour vérifier la similarité des chaînes, etc.

Un switch ne fera pas, cependant, car il compare les expressions statiques contre une seule valeur. Vous devrez utiliser if s.

+0

de base Xii pourrait vous fournir la version s'il vous plaît correcte du commutateur i utilisé pour faire ce que je veux accomplir? Juste essayé de réécrire le commutateur en utilisant cette strpos(), mais a obtenu une erreur, je suppose que je ne sais pas comment le faire. – sebastian

1

Vous pouvez utiliser strpos fonction:

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

DAMN, ça a marché, tu es mon idole, merci! – sebastian

5

Puisque dans une déclaration switch qu'un simple test d'égalité sera effectuée, il ne vous aidera pas beaucoup ici. Vous devez exécuter la chaîne à l'aide d'une fonction de correspondance de chaînes, dont la meilleure est strpos. La réponse avant droite est:

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

La solution la plus élégante serait quelque chose comme ceci:

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

Ou, si la correspondance entre le mot-clé et le fichier est toujours 1: 1:

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

merci pour votre réponse, ça m'a aidé! – sebastian

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

Je ne recommanderais pas d'inclure les fichiers php basés sur l'entrée de l'utilisateur.

+2

S'il est comparé à une liste blanche, dans ce cas, il ne devrait pas y avoir de problème, y compris les fichiers basés sur l'entrée de l'utilisateur. – deceze

30

Basé sur this question et this answer, les solutions que je suis venu avec (tout en utilisant un cas, sélectionnez) sont ci-dessous. Vous pouvez utiliser stristr() ou strstr(). La raison pour laquelle j'ai choisi d'utiliser stristr() dans ce cas est simplement parce que c'est insensible, et donc, est plus robuste.

Exemple:

$linkKW = $_GET['kw']; 

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

Vous pouvez également utiliser stripos() ou strpos() si vous souhaitez (merci, Fractaliste), bien que je trouve cela plus difficile à lire. Même accord que l'autre méthode ci-dessus; Je suis allé l'affaire insensible route.

Exemple:

$linkKW = $_GET['kw']; 

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

Votre idée avec 'strpos()': 'switch (true) {cas strpos ($ nom, 'incident')! == false:/* Le travail * /' – Fractaliste

0

Je sais que c'est bien après le fait, mais comme une part, on peut toujours éviter la boucle tout à fait s'attendre à un rapport 1: 1.

Quelque chose le long des lignes de:

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

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

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

... le partage comme un FYI pour les débutants.

0

Vous pouvez également utiliser des expressions régulières dans le commutateur -> cas:

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

    } 
?>