我正在使用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语句)评估给定字符串是否包含值?
谢谢。
基于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;
}
),尽管我个人认为这更难阅读。与上述其他方法相同;我走了不区分大小写的路线。
例:
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;
}
}
更优雅的解决方案是这样的:
$keywords = array('berlingo', 'c4', …);
foreach ($keywords as $keyword) {
if (strpos($_GET['kw'], $keyword) !== false) {
include "$keyword.php";
break;
}
}
或者,如果关键字和文件之间的对应关系始终为1:1:
strpos
你可以使用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");
<?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文件。
您还可以在switch - > case中使用正则表达式:
strpos()
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。
事实上,我知道这是事实,但是如果期望1:1的关系,那么总是可以完全避免循环。
有点像:
switch
......只是作为新手的FYI分享。
在我看来,如果你通过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自动加载标准包含您需要的各种脚本。与路由器库结合使用可能对解决您的实际需求最有用。