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

时间:2010-11-14 02:36:52

标签: php string switch-statement url-parameters php-include

我正在使用PHP开关根据页面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语句)评估给定字符串是否包含值?

感谢。

8 个答案:

答案 0 :(得分:35)

根据this questionthis answer,我提出的解决方案(,同时仍使用案例选择)如下所示。

您可以使用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,不过我个人认为这更难读。与上述其他方法相同;我去了case- 不敏感的路线。

示例:

$linkKW = $_GET['kw'];

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

答案 1 :(得分:8)

由于在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;
    }
}

答案 2 :(得分:1)

您可以将strpos功能用作:

if(strpos($_GET['kw'],'berlingo') !== false) {
 include 'berlingo.php';
}
if(strpos($_GET['kw'],'c4') !== false) {
 include 'c4.php';
}

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

您还可以在开关中使用正则表达式 - &gt;情况下:

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

    } 
?>

答案 5 :(得分:0)

strpos()用于检查字符串是否包含另一个字符串。

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

但是switch不会这样做,因为它将静态表达式与单个值进行比较。您必须使用if s。

答案 6 :(得分:0)

我知道这是事后的事情,但是,如果期望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 :(得分:0)

我认为,如果要通过GET变量包含脚本,这是一种代码味道,但是您可以使用带有值的类来优雅地做到这一点,该类的逻辑如果为true则返回值对象本身。

这个想法是要记住,switch语句将执行$ switch == $ case(松散匹配)的任何代码。因此,只需创建返回$this或什么都不返回的方法即可。

示例:

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';
}

您当然可以慷慨地用typehints修饰此代码。如果这样做了,并且没有使用支持空值返回类型(即方法签名为public function contains(string $substring): ?Haystack)的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);为真,则非匹配属性“ $ isMain”将确保它们的值不相等。

再次,我将重新考虑为什么您要针对这种特殊情况首先进行此操作;传统上,Composer是一种依赖项管理工具,可用于通过PSR自动加载标准来包含所需的各种脚本。结合使用路由器库可能对满足您的实际需求最有用。