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

Posted

技术标签:

【中文标题】如何使用 PHP switch 语句检查字符串是不是包含单词(但也可以包含其他单词)?【英文标题】:How to use a PHP switch statement to check if a string contains a word (but can also contain others)?如何使用 PHP switch 语句检查字符串是否包含单词(但也可以包含其他单词)? 【发布时间】:2011-05-09 17:19:09 【问题描述】:

我正在使用 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,我想要在第一种情况下包含berlingo.php 文件,但它不必完全正确 仅此关键字。

例如,如果关键字是berlingo,我想包含berlingo.php 文件,但如果是citroen berlingo,我也想包含

如何使用 PHP 案例选择(switch 语句)评估给定字符串是否包含值?

谢谢。

【问题讨论】:

【参考方案1】:

在我看来,如果您通过 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';

当然,您可以慷慨地用类型提示来装饰这段代码。如果你这样做了,并且没有使用支持可空返回类型的 PHP 版本(即public function contains(string $substring): ?Haystack 的方法签名),那么你的类将不得不详细说明以反映这一点。

例子:

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 自动加载标准包含您需要的各种脚本。与路由器库结合使用可能对满足您的实际需求最有用。

【讨论】:

【参考方案2】:

你也可以在 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;

     
?>

【讨论】:

【参考方案3】:

基于this question 和this 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),尽管我个人觉得这更难阅读。与上述其他方法相同的交易;我走的是大小写-不敏感路线。

示例:

$linkKW = $_GET['kw'];

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

【讨论】:

你对strpos()的想法:switch (true) case strpos($name, 'incident') !== false: /* The job */【参考方案4】:

我知道这是事后诸葛亮,但顺便说一句,如果期望 1:1 的关系,人们总是可以完全避免循环。

类似的东西:

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

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

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

...仅供新手参考。

【讨论】:

【参考方案5】:
$keywords = array('berlingo', 'c4');
foreach($keywords as $keyword)
  if(strpos($_GET['kw'], $keyword) !== FALSE)
    include("$keyword.php");

不过,我不建议包含基于用户输入的 php 文件。

【讨论】:

如果它与白名单匹配,在这种情况下,包括基于用户输入的文件应该没有问题。【参考方案6】:

由于在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】:

您可以将strpos 函数用作:

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

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

【讨论】:

【参考方案8】:

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

还有other functions用于检查字符串的相似度等。

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

【讨论】:

Core Xii 您能否提供我使用的正确版本的开关来完成我想要完成的任务?刚刚尝试使用该 strpos() 重写开关但出现错误,我猜我不知道该怎么做。

以上是关于如何使用 PHP switch 语句检查字符串是不是包含单词(但也可以包含其他单词)?的主要内容,如果未能解决你的问题,请参考以下文章

Android检查int是不是在区间+ switch语句中

下划线符号是不是会忽略或检查 Swift 中 switch 语句中的无效性?

java检查char是不是是switch case语句中的数字[关闭]

使用 PHP 检查多个值是不是为整数的最简单方法是啥?

如何检查字符串是不是包含子字符串并且在 Bash 中不包含 [重复]

如何在php中检查mysql select语句结果是不是有值?