Как использовать оператор 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)?
Спасибо.
Ответы
Ответ 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;
}
?>