Как использовать оператор 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)?

Благодарю.

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

    Вы можете использовать либо 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; } 

    Так как в инструкции 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; } } 

    Вы можете использовать функцию strpos как:

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

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

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

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

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

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

    Что-то вроде:

     $map = array('berlingo' => 'berlingo.php', 'c4' => 'c4.php', …); if( !isset( $map[$_GET['kw']] )) throw new Exception("Blah!!"); include $map[$_GET['kw']]; 

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

    Вы также можете использовать регулярное выражение в случае 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; } ?>