2017-06-01 79 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 /測試其運行第二種情況,但不知道如何。可以肯定的事情是錯誤的,我的正則表達式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

隨着inproper使用'之開關,'^/OOP /網頁/視圖/ \ d + $'不會的匹配'http:// example.com/oop/page/view/1',因爲'^'錨點。刪除'^'它應該可以工作。 https://3v4l.org/lHgqm – AbraCadaver

+0

@AbraCadaver謝謝你的回答,但正如你可以看到我沒有用http://檢查完整地址,但只是url參數在我的情況下,等於$ _SERVER ['REQUEST_URI 「]。 –

+0

OK,習慣顯示準確的數據,包含什麼變量等... – AbraCadaver

回答

1

你應該做的卻是這樣的:

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

我不記得,如果在PHP開關是嚴格或寬鬆相比,但如果它是嚴格的,只需在每個案例前面放一個!!將其轉換爲布爾值。

+2

注意: 請注意,開關/外殼沒有寬鬆的比較。 http://php.net/manual/en/control-structures.switch.php – Lando

+0

還需要將第一種情況更改爲'case $ url =='':' – Barmar

+0

@Landen Cool,謝謝蘭登。 – Brad

1

switch語句將每個case表達式與switch()中的原始表達式進行比較。所以

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

類似於:

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

這顯然不是你想要的。如果你想測試不同類型的表達式,不使用switch(),使用if/elseif/else

if ($url == '') { 
    echo 'Homepage'; 
} elseif (preg_match('#^/oop/page/view/\d+$#', $url)) { 
    echo $url; 
} else { 
    echo '404 page'; 
} 
+1

'switch()'實際上完全適用於你只需要匹配的事物列表,或者將事例組合在一起(沒有'break')。這是正確的控制結構。請參閱我的回答,以獲取相關信息。 – Brad

+0

@布拉德我通常認爲倒轉的'switch/case'是一個變態。它提供任何好處的唯一情況是,如果您需要沒有「中斷」的穿透,但這非常罕見。 – Barmar

+0

@Brad將條件組合在一起可以使用'if()'中的'||'完成。 – Barmar