我正在使用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语句)评估给定字符串是否包含值?
感谢。
答案 0 :(得分:35)
根据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,不过我个人认为这更难读。与上述其他方法相同;我去了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)
答案 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自动加载标准来包含所需的各种脚本。结合使用路由器库可能对满足您的实际需求最有用。