Я использую 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; } ?>