it-swarm.com.ru

Как использовать 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 case select (switch switch)?

Благодарю.

20
sebastian

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

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

Пример:

$linkKW = $_GET['kw'];

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

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

Пример:

$linkKW = $_GET['kw'];

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

Поскольку в операторе 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;
    }
}
7
deceze

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

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

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

1
chris

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

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

    } 
?>
1
AlexIL

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

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

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

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

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

... просто делюсь информацией о себе как новичку.

0
mOrloff

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

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

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

0
Core Xii