2011-04-06 60 views
0

如何解決它或添加正則表達式?開關盒上的問題

case substr($rrr['url'],-4)=='.jpg' || '.png' || '.gif' || '.tif' || '.tiff': 
+0

是檢查區分大小寫? 'http:// example.com/icon.JPG'那麼查詢參數呢? 'http://example.com/icon.jpg?src = search'其他網頁呢? 'http:// example.com/evil#justlookslegit.jpg' – Kobi 2011-04-06 08:58:13

+0

試試'strrchr($ rrr [「url」],「。」)'來獲得擴展名。 – mario 2011-04-06 22:27:45

回答

5

這樣的事情?

case in_array(substr($rrr['url'],-4), array('.jpg','.png','.gif','.tif')): 
case in_array(substr($rrr['url'],-5), array('.tiff')): 

注意,我省略了case -expression之間break;

也很酷:

case in_array(pathinfo($rrr['url'], PATHINFO_EXTENSION), array('jpg','png','gif','tif', 'tiff')): 

從問題不工作的片斷,因爲它的評價,分爲(縮短)

(substr($rrr['url'],-4)=='.jpg') || '.png' 

這工作,但oviously它沒有太大的意義,是非常可能不是,預期的是什麼。

更新:此解決方案看起來更清潔。它假定,$rrr['url']是唯一有趣的地方。看評論

switch (pathinfo($rrr['url'], PATHINFO_EXTENSION)): 
    case 'jpg': 
    case 'png': 
    case 'gif': 
    case 'tif': 
    case 'tiff': 
    do_something(); 
    break; 
} 
+0

謝謝..它的工作:) – Abudayah 2011-04-06 08:58:31

+0

如果這確實用作'switch'' case',這將不會像你期望的那樣工作。如果它可以工作,那只是因爲該表達式的結果與「switch」比較值大致相當。 – deceze 2011-04-06 09:07:48

+0

@deceze:提問者忽略了'switch($ expr)'部分,所以我不得不猜測。也許它只是'切換(真)'。 – KingCrunch 2011-04-06 09:17:35

0

你不能使用A == B || C || D語句是,只有A == B || A == C || A == D

另外,URL可以有GET參數。

4
  1. $foo == A || B || C不起作用,這就需要將$foo == A || $foo == B || $foo == Cin_array($foo, array(A, B, C))
  2. 您不能在switch聲明中有複雜的case s。每種情況下只能有一個值用於比較比較值。你不得不寫這作爲單獨的落空case S:

    switch ($foo) { 
        case A : 
        case B : 
        case C : 
         bar(); 
         break; 
    } 
    
0

你需要找點strrpos,獲得子右端後點位置(其返回的strrpos),定義允許陣列擴展(這也使您的代碼可重用),然後用in_array這樣的:

 
$rpos = strrpos($rrr['url'], '.'); 
$ext = substr($rrr['url'], $rpos+1); 
$allowedExtensions = array('jpg','png', 'gif', 'tif', 'tiff'); 
///.... 
if (in_array($ext, $allowedExtensions)) { 
///....