2010-11-14 8 views
18

Ich benutze einen PHP-Switch, um bestimmte Dateien basierend auf den eingehenden Keywords in einem Parameter der URL der Seite enthalten.Wie verwende ich eine PHP-switch-Anweisung, um zu überprüfen, ob eine Zeichenfolge ein Wort enthält (aber auch andere enthalten kann)?

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

Innerhalb der Seite, würde ich so etwas wie diese verwenden mag:

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

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

    } 
?> 

Was will ich im ersten Fall zu tun ist, umfasst Die berlingo.php Datei, wenn der Schlüsselwortparameter enthältberlingo, aber es muss nicht genau dieses Schlüsselwort sein.

Zum Beispiel möchte ich die berlingo.php Datei aufzunehmen, wenn das Schlüsselwort berlingo, aber auch wenn es citroen berlingo ist.

Wie kann ich beurteilen, ob eine gegebene Zeichenfolge einen Wert enthält, der eine PHP-Anfrage verwendet? Select (switch-Anweisung)?

Danke.

Antwort

0

strpos() ist eine Abfrage, ob eine Zeichenfolge eine andere Zeichenfolge enthält.

Es gibt other functions für Ähnlichkeit der Zeichenketten Überprüfung usw.

A switch nicht tun, obwohl, da es statische Ausdrücke gegen einen einzelnen Wert vergleicht. Sie müssen if s verwenden.

+0

Kern Xii könnten Sie bitte die korrekte Version des Schalters liefern i verwendet, um zu tun, was ich erreichen will? Ich habe gerade versucht, den Schalter mit diesem strpos() neu zu schreiben, habe aber einen Fehler bekommen, ich weiß nicht, wie ich es machen soll. – sebastian

1

können Sie verwenden strpos Funktion als:

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

DAMN, das hat funktioniert, du bist mein Idol, danke! – sebastian

5

in einer switch Aussage Da nur eine einfache Gleichheitsprüfung wird durchgeführt werden, werden Sie hier nicht viel helfen. Sie müssen den String durch eine String-Matching-Funktion ausführen, die am besten geeignet ist strpos. Die eindeutige Antwort lautet:

$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 Übereinstimmung zwischen dem Schlüsselwort und die Datei ist immer 1:

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 so etwas wie dieses wäre 1:

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

danke für deine antwort, es hat geholfen! – sebastian

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

Ich würde nicht empfehlen, PHP-Dateien basierend auf Benutzereingaben obwohl.

+2

Wenn es mit einer Whitelist verglichen wird, wie in diesem Fall, sollte es kein Problem geben, einschließlich Dateien basierend auf Benutzereingaben. – deceze

30

Basierend auf this question und this answer, die Lösungen, die ich habe kommen mit (während immer noch einen Fall wählen mit) unten sind.

Sie können entweder stristr() oder strstr() verwenden. Der Grund, warum ich stristr() in diesem Fall wählte, ist einfach, weil es insensitive unempfindlich ist und folglich, ist 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 möchten (danke, Fractaliste), obwohl ich persönlich diese schwieriger zu lesen finden. Selber wie die andere oben genannte Methode; Ich ging die insensitive Route.

Beispiel:

$linkKW = $_GET['kw']; 

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

Ihre Idee mit 'strpos()': 'switch (true) {case strpos ($ name, 'incident')! == false:/* Der Job * /' – Fractaliste

0

Ich weiß, diese Art und Weise nach der Tat, sondern nur als beiseite, kann man immer die Schleife ganz vermeiden, wenn eine 1 erwarten: 1-Beziehung.

Etwas entlang der Linien von:

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

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

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

... teilen nur als FYI für Anfänger.

0

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

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

    } 
?>