wake-up-neo.net

Wie benutzt man a PHP switch-Anweisung, um zu überprüfen, ob eine Zeichenfolge ein Wort enthält (aber auch andere enthalten kann)?

Ich verwende einen Schalter PHP, um bestimmte Dateien einzuschließen, die auf den eingehenden Schlüsselwörtern basieren, die in einem Parameter der URL der Seite übergeben werden.

Die URL könnte beispielsweise sein: ...page.php?kw=citroen%20berlingo%20keywords

Innerhalb der Seite würde ich gerne so etwas verwenden:

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

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

    } 
?>

Im ersten Fall möchte ich die Datei berlingo.php einschließen, wenn der Schlüsselwortparameterberlingo enthält, es muss jedoch nicht nur genau dieses Schlüsselwort sein.

Zum Beispiel möchte ich die Datei berlingo.php einschließen, wenn das Schlüsselwort berlingo lautet, aber auch , wenn es sich um citroen berlingo handelt.

Wie kann ich auswerten, ob eine bestimmte Zeichenfolge einen Wert enthält, indem ich PHP case select (switch-Anweisung) verwende?

Vielen Dank.

20
sebastian

Basierend auf dieser Frage und dieser Antwort sind die Lösungen, die ich gefunden habe (während ich noch einen Fall auswähle) unten.

Sie können entweder stristr () oder strstr () verwenden. Der Grund, warum ich mich in diesem Fall für stristr() entschieden habe, ist einfach die Groß- und Kleinschreibung -unempfindlich und daher robuster.

Beispiel:

$linkKW = $_GET['kw'];

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

Sie könnten auch stripos () oder strpos () verwenden, wenn Sie (danke, Fractaliste ) möchten, obwohl ich persönlich das schwieriger zu lesen finde. Gleicher Deal wie die andere Methode oben; Ich habe den Fall -unempfindlich Weg gegangen.

Beispiel:

$linkKW = $_GET['kw'];

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

Da in einer switch-Anweisung nur ein einfacher Gleichheitstest durchgeführt wird, hilft Ihnen dies hier nicht viel. Sie müssen den String durch eine String-Matching-Funktion laufen lassen, von der strpos am besten geeignet ist. Die direkte Antwort lautet:

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

Die elegantere Lösung wäre etwa so:

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

Oder, wenn die Entsprechung zwischen dem Schlüsselwort und der Datei immer 1: 1 ist:

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

Sie können strpos verwenden als:

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

Ich würde jedoch nicht empfehlen, PHP-Dateien basierend auf Benutzereingaben einzuschließen.

1
chris

Sie können reguläre Ausdrücke auch in switch -> case verwenden:

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

Ich weiß, dass dies WEG ist, aber abgesehen davon kann man die Schleife immer ganz vermeiden, wenn man eine 1: 1-Beziehung erwartet.

Etwas in der Art von:

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

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

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

... nur als FYI für Neulinge.

0
mOrloff

Meiner Meinung nach ist es ein Codegeruch , wenn Sie Skripte über GET-Variablen einbinden, aber Sie können dies elegant mit einer Werteklasse mit Methoden tun, deren Logik Gibt das Wertobjekt selbst zurück, wenn true.

Die Idee ist zu bedenken, dass eine switch -Anweisung jeden Code ausführt, bei dem $ switch == $ case (eine lose Übereinstimmung) ist. Erstellen Sie also einfach Methoden, die entweder $this Oder gar nichts zurückgeben.

Beispiel:

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

Sie können diesen Code natürlich großzügig mit Schreibmaschinen versehen. Wenn Sie dies tun und keine Version von PHP, die nullfähige Rückgabetypen unterstützt (dh eine Methodensignatur von public function contains(string $substring): ?Haystack), müsste Ihre Klasse dies berücksichtigen .

Beispiel:

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

Wenn Ihre explizite Übereinstimmungslogik in der Methode fehlschlägt und aus irgendeinem Grund new Haystack($_GET['kw']) == new Haystack($needle); wahr ist, stellt die nicht übereinstimmende Eigenschaft "$ isMain" sicher, dass sie nicht als gleich bewertet werden.

Ich würde noch einmal prüfen, warum Sie dies in dieser speziellen Situation überhaupt tun möchten. Normalerweise ist Composer ein Tool zur Verwaltung von Abhängigkeiten, mit dem Sie verschiedene Skripten einbinden können, die Sie über einen PSR-Autoload-Standard benötigen. Dies ist in Kombination mit einer Router-Bibliothek wahrscheinlich am nützlichsten, um Ihre tatsächlichen Anforderungen zu erfüllen.

0
user1718888

strpos() dient zum Überprüfen, ob eine Zeichenfolge eine andere Zeichenfolge enthält.

Es gibt andere Funktionen zum Überprüfen der Ähnlichkeit von Zeichenfolgen usw.

Eine switch reicht jedoch nicht aus, da sie statische Ausdrücke mit einem einzelnen Wert vergleicht. Sie müssen ifs verwenden.

0
Core Xii