如何使用PHP switch语句检查字符串是否包含单词(但也可以包含其他单词)?

问题描述 投票:24回答:8

我正在使用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,我想要包含this question文件。

如何使用PHP case select(switch语句)评估给定字符串是否包含值?

谢谢。

php string switch-statement url-parameters php-include
8个回答
36
投票

基于this answerstristr(),我提出的解决方案(仍使用案例选择)如下。

你可以使用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

8
投票

因为在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;
    }
}

更优雅的解决方案是这样的:

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

或者,如果关键字和文件之间的对应关系始终为1:1:

strpos

1
投票

你可以使用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");

1
投票
<?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;

    } 
?>

我不建议根据用户输入包含php文件。


1
投票

您还可以在switch - > case中使用正则表达式:

strpos()

0
投票

other functions用于检查字符串是否包含另一个字符串。

switch用于检查字符串的相似性等。

但是,if不会这样做,因为它将静态表达式与单个值进行比较。你必须使用$map = array('berlingo' => 'berlingo.php', 'c4' => 'c4.php', …); if( !isset( $map[$_GET['kw']] )) throw new Exception("Blah!!"); include $map[$_GET['kw']]; s。


0
投票

事实上,我知道这是事实,但是如果期望1:1的关系,那么总是可以完全避免循环。

有点像:

switch

......只是作为新手的FYI分享。


0
投票

在我看来,如果你通过GET变量包含脚本,那就是代码味道,但你可以优雅地使用一个值类,其方法的逻辑返回值对象本身(如果为true)。

我的想法是记住,$this语句将执行$ switch == $ case(松散匹配)的任何代码。因此,只需创建返回class Haystack { public $value; public function __construct($value) { $this->value = $value; } public function contains($needle): { if (strpos($this->value, $needle) !== false) return $this; } } $kw = new Haystack($_GET['kw']); switch ($kw) { case $kw->contains('berlingo'): require_once 'berlingo.php'; case $kw->contains('c4'): require_once 'c4.php'; } 的方法,或者根本不创建任何内容。

例:

public function contains(string $substring): ?Haystack

当然,您可以使用typehints慷慨地装饰此代码。如果您这样做,并且没有使用支持可空返回类型的PHP版本(即final class Haystack { private $value; private $isMain; public function __construct(string $value, bool $isMain = true) { $this->value = $value; $this->isMain = $isMain; } final public function contains($needle): Haystack { if (strpos($this->value, $needle) !== false) return $this; return new Haystack($needle, false); } } 的方法签名),那么您的类必须详细说明以反映这一点。

例:

new Haystack($_GET['kw']) == new Haystack($needle);

这样,如果您的显式匹配逻辑在方法内部失败,如果由于某种原因Composer为真,则不匹配的属性“$ isMain”将确保它们不被评估为相等。

同样,我会重新审视为什么你想在这个特殊情况下首先做这件事;传统上,qazxswpoi是一个依赖管理工具,可用于通过PSR自动加载标准包含您需要的各种脚本。与路由器库结合使用可能对解决您的实际需求最有用。

© www.soinside.com 2019 - 2024. All rights reserved.