web-dev-qa-db-ja.com

PHP switchステートメントを使用して、文字列に単語が含まれているかどうかを確認する方法(ただし、他の単語を含めることもできます)

PHPスイッチを使用して、ページのURLのパラメーターで渡される着信キーワードに基づいて特定のファイルを含めています。

たとえば、URLは次のようになります:...page.php?kw=citroen%20berlingo%20keywords

ページ内では、次のようなものを使用したいと思います。

<?
    switch($_GET['kw']){

        case "berlingo":     
            include 'berlingo.php'
            break;
        case "c4":
            include 'c4.php';
            break;

    } 
?>

最初のケースで私がやりたいのは、キーワードパラメータcontainsberlingoの場合にberlingo.phpファイルを含めることですが、必須ではありませんexactlyそのキーワードのみ。

たとえば、キーワードがberlingoの場合はberlingo.phpファイルを含めますが、citroen berlingoの場合はalsoを含めます。

PHP case select(switchステートメント))を使用して、指定された文字列に値が含まれているかどうかをどのように評価できますか?

ありがとう。

27
sebastian

この質問この答え に基づいて、私が思いついた解決策(を使用しながら、まだケースを選択)以下にあります。

stristr() または strstr() を使用できます。この場合にstristr()を使用することを選択した理由は、大文字小文字が区別されないためですinsensitive。したがって、より堅牢です。

例:

$linkKW = $_GET['kw'];

switch (true){
   case stristr($linkKW,'berlingo'):
      include 'berlingo.php';
      break;
   case stristr($linkKW,'c4'):
      include 'c4.php';
      break;
}

また、必要に応じて stripos() または strpos() を使用することもできます(thanks、 Fractaliste、個人的にこれを読むのはもっと難しいと思います。上記の他の方法と同じ取引。私は大文字小文字の区別があるinsensitiveルートを使いました。

例:

$linkKW = $_GET['kw'];

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

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;
    }
}
8
deceze

strpos 関数は次のように使用できます。

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

ただし、ユーザー入力に基づいてphpファイルを含めることはお勧めしません。

1
chris

スイッチ->ケースで正規表現を使用することもできます。

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

    } 
?>
1
AlexIL

私はこれが事実の後の方法であることを知っていますが、余談ですが、1対1の関係を期待している場合は、ループを完全に回避できます。

以下に沿ったもの:

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

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

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

...初心者向けの参考情報として共有するだけです。

0
mOrloff

私の意見では、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のバージョンでnull許容の戻り値タイプをサポートしている(つまり、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);がtrueであれば、非マッチングプロパティ "$ isMain"により、それらが等しいと評価されません。

繰り返しますが、この特定の状況でそもそもなぜこれを実行したいのかを再検討します。従来、 Composer は、PSRオートロード標準を介して必要なさまざまなスクリプトを含めるために使用される依存関係管理ツールです。ルーターライブラリと組み合わせると、実際のニーズに対応するのにおそらく最も役立ちます。

0
user1718888

strpos() は、文字列に別の文字列が含まれているかどうかを確認するためのものです。

文字列の類似性をチェックするための その他の関数 などがあります。

ただし、静的な式を単一の値と比較するため、switchは機能しません。 ifsを使用する必要があります。

0
Core Xii