2017-06-01 12 views
2

私はswitch文の中にpreg_match()を作成するのにいくつか問題があります。preg_matchを使用したPHP switch文

/oop/page/view/[some-number]と一致するpreg_matchを書きたいと思います。今の

のようなその作業:

私は私のブラウザで http://example.com/oop/page/view/1そのショー「404ページ」を実行する場合

。 そして、たとえばhttp://example.com/oop/page/view/testのアドレスを実行した場合でも、/ oop/testを実行しても2番目のケースが実行されていて、まだわかりません。何かが私の正規表現expresionで間違っていることを確認するために..あなたの代わりに何をすべき

public function check(){ 
    $url = filter_input(INPUT_GET, 'url'); 
    switch ($url) { 
     case '': 
      echo 'HomePage'; 
      break; 
     case preg_match('#^/oop/page/view/\d+$#', $url): 
      echo $url; 
      break; 
     default: 
      echo '404 page'; 
      break; 
    } 

} 
+0

'^'アンカーのために 'http:// example.com/oop/page/view/1'にマッチします。 '^'を削除すれば動作します。 https://3v4l.org/lHgqm – AbraCadaver

+0

@AbraCadaver答えてくれてありがとうございますが、私がhttp://で完全なアドレスを確認しているわけではありませんが、url paramだけ$ _SERVER ['REQUEST_URI ']。 –

+0

OK、正確なデータ、変数などを表示するのに慣れてください。 – AbraCadaver

答えて

1

は次のようなものです:PHPのスイッチが厳密か緩い比較であれば、私は、覚えていない

switch (true) { 
    case preg_match(...): 

厳密であれば、各ケースの前に!!を入れてブール値に変換してください。

+2

注: スイッチ/ケースは緩やかな比較を行います。 http://php.net/manual/en/control-structures.switch.php – Lando

+0

また、最初のケースを 'case $ url == ''に変更する必要があります: – Barmar

+0

@Landen Cool、thanks Landen。 – Brad

1

switch文は、の各式とswitch()の元の式を比較します。だから、

case preg_match('#^/oop/page/view/\d+$#', $url): 

に類似している:これは何をしたい明確ではありません

if ($url == preg_match('#^/oop/page/view/\d+$#', $url)) 

。あなたがswitch()を使用していない、表情の異なる種類をテストしたい場合は、if/elseif/elseを使用します。

`switch`、` ^/OOP /ページ/ビュー/ \ dの+ $ `文句を言わないのinproper使用とともに
if ($url == '') { 
    echo 'Homepage'; 
} elseif (preg_match('#^/oop/page/view/\d+$#', $url)) { 
    echo $url; 
} else { 
    echo '404 page'; 
} 
+1

'switch()'は実際には1つだけのマッチが必要なもののリスト、または一緒に(ブレイクせずに)グループ化されるケースのリストには完全に適切です。それは適切な制御構造です。これを行う方法について私の答えを見てください。 – Brad

+0

@ブラッド私は、逆の 'switch/case'が倒錯であると一般的に考える。何か利点がある唯一の状況は、「休憩」なしでフォールスルーが必要な場合ですが、それは非常にまれです。 – Barmar

+0

@Brad条件をグループ化するには、 'if()'で '||'を使うことができます。 – Barmar