web-dev-qa-db-fra.com

Comment utiliser A PHP Instruction de commutateur pour vérifier si une chaîne contient un mot (mais peut également contenir d'autres)?

J'utilise un PHP Switch pour inclure certains fichiers en fonction des mots-clés entrants passés dans un paramètre de l'URL de la page.

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

À l'intérieur de la page, j'aimerais 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, c'est inclure le berlingo.php Fichier si le paramètre de mots-clés Contientberlingo, mais il n'est pas nécessaire que ce soit exactement ce mot clé seul.

Par exemple, je veux inclure le berlingo.php Fichier si le mot clé est berlingo, mais aussi si c'est citroen berlingo.

Comment puis-je évaluer si une chaîne donnée contient une valeur à l'aide d'un PHP SELECT SELECT (Déclaration de commutation)?

Merci.

27
sebastian

Basé sur - Cette question et cette réponse , les solutions que j'ai proposées ( tout en utilisant toujours une case SELECT) sont ci-dessous.

Vous pouvez utiliser soit stristr () ou strtstr () . La raison pour laquelle j'ai choisi d'utiliser stristr() Dans ce cas est simplement parce que c'est le cas - 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 Strows () Si vous souhaitez Merci , fractaliste ) =, bien que je trouve personnellement cela plus difficile à lire. Même affaire que l'autre méthode ci-dessus; Je suis allé le cas - 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;
}
36
baacke

Depuis dans une déclaration switch Seuls un simple test d'égalité sera effectué, il ne vous aidera pas beaucoup ici. Vous devez exécuter la chaîne via une fonction de correspondance de chaîne, mieux adaptée à ce qui est strpos. La réponse directe 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 une 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;
    }
}
8
deceze

Vous pouvez utiliser Strows fonction comme suit:

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

Vous pouvez également utiliser une expression régulière dans le commutateur -> Case:

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

    } 
?>
1
AlexIL

Je sais que cela est bien après le fait, mais aussi de côté, on peut toujours éviter la boucle si vous attendez une relation 1: 1.

Quelque chose dans le sens de:

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

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

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

... Il suffit de partager en tant que FYI pour les débutants.

0
mOrloff

À mon avis, c'est une odeur de code Si vous y compris des scripts via Get Variables, mais vous pouvez le faire avec élégance à l'aide d'une classe de valeur avec des méthodes dont la logique Renvoie l'objet de valeur elle-même si vrai.

L'idée est de garder à l'esprit qu'un switch instruction exécutera n'importe quel code où $ Switch == $ Case (une correspondance). Donc, créer des méthodes qui renvoient $this, Ou rien du tout.

Exemple:

class Haystack {
    public $value;

    public function __construct($value)
    {
        $this->value = $value;
    }

    public function contains($needle):
    {
        if (strpos($this->value, $needle) !== false)
            return $this;
    }
}

$kw = new Haystack($_GET['kw']);

switch ($kw) {
    case $kw->contains('berlingo'):
        require_once 'berlingo.php';
    case $kw->contains('c4'):
        require_once 'c4.php';
}

Bien sûr, vous pouvez généreusement garnir ce code avec Typehint. Si vous le faites, et n'utilisez pas une version de PHP= Supporte des types de retour nullables (c'est-à-dire une signature de méthode de public function contains(string $substring): ?Haystack), votre classe devrait alors élaborer que .

Exemple:

final class Haystack {
    private $value;
    private $isMain;

    public function __construct(string $value, bool $isMain = true)
    {
        $this->value = $value;
        $this->isMain = $isMain;
    }

    final public function contains($needle): Haystack
    {
        if (strpos($this->value, $needle) !== false)
            return $this;
        return new Haystack($needle, false);
    }
}

De cette façon, si votre logique de correspondance explicite échoue à l'intérieur de la méthode, si pour une raison quelconque new Haystack($_GET['kw']) == new Haystack($needle); est vraie, la propriété non correspondante "$ ismain" s'assurera qu'elles ne sont pas évaluées comme étant égales.

Encore une fois, je reviendrais à réexaminer pourquoi vous voudriez faire cela en premier lieu pour cette situation particulière; Traditionnellement, - Compositeur est un outil de gestion de dépendance qui serait utilisé pour inclure divers scripts dont vous avez besoin via une norme AutoLoad PSR. Qu'en combinaison avec une bibliothèque de routeurs serait probablement la plus utile de répondre à vos besoins réels.

0
user1718888

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

Il y a Autres fonctions pour vérifier la similitude des chaînes, etc.

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

0
Core Xii