Подтвердить что ты не робот

Как использовать оператор switch PHP, чтобы проверить, содержит ли строка слово (но может также содержать другие)?

Я использую PHP-переключатель для включения определенных файлов на основе входящих ключевых слов, переданных в параметре URL-адреса страницы.

URL, например, может быть: ...page.php?kw=citroen%20berlingo%20keywords

Внутри страницы я хотел бы использовать что-то вроде этого:

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

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

    } 
?>

То, что я хочу сделать в первом случае, включает файл berlingo.php, если параметр ключевого слова содержит berlingo, но это не должно быть именно это ключевое слово.

Например, я хочу включить файл berlingo.php, если ключевое слово berlingo, но также и citroen berlingo.

Как я могу оценить, содержит ли данная строка значение, используя выбор случая PHP (оператор switch)?

Спасибо.

4b9b3361

Ответ 1

На основе этого вопроса и этот ответ, решения, которые я придумал (пока еще используя выбор случая) ниже.

Вы можете использовать stristr() или strstr(). Причина, по которой я выбрал использовать stristr(), в этом случае - просто потому, что она нечувствительна к регистру и, следовательно, более надежна.

Пример:

$linkKW = $_GET['kw'];

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

Вы также можете использовать stripos() или strpos(), если вы хотите (спасибо, Fractaliste), хотя я лично считаю это труднее читать. То же самое, что и другой метод выше; Я прошел путь, нечувствительный к регистру.

Пример:

$linkKW = $_GET['kw'];

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

Ответ 2

Так как в выражении switch будет проведено простое тестирование равенства, это не поможет вам здесь. Вам нужно запустить строку с помощью функции сопоставления строк, наиболее подходящей из которых является strpos. Прямой ответ:

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

Более элегантным решением было бы что-то вроде этого:

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

Или, если соответствие между ключевым словом и файлом всегда равно 1:1:

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

Ответ 3

Вы можете использовать strpos как:

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

Ответ 4

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

Я бы не рекомендовал включать php файлы на основе ввода пользователя.

Ответ 5

strpos() - это один для проверки того, содержит ли строка другую строку.

другие функции для проверки сходства строк и т.д.

A switch не будет делать, однако, поскольку он сравнивает статические выражения с одним значением. Вам нужно будет использовать if s.

Ответ 6

Я знаю, что это путь после факта, но так же, как и в стороне, всегда можно избежать цикла вообще, если ожидаете отношения 1:1.

Что-то по строкам:

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

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

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

... просто делясь как FYI для новичков.

Ответ 7

Вы также можете использовать регулярное выражение в случае switch → :

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

    } 
?>