开关盒问题

时间:2011-04-06 08:40:24

标签: php regex switch-statement

如何解决或添加正则表达式?

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

4 个答案:

答案 0 :(得分:5)

这样的东西?

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

请注意,我在break; - 表达式之间省略了case

也很酷:

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

问题的片段不起作用,因为它被评估为(缩短的)

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

这是有效的,但显然它没有多大意义,很可能不是,预期的。

更新:此解决方案看起来更清晰。它假定,$rrr['url']是唯一有趣的。见评论

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

答案 1 :(得分:4)

  1. $foo == A || B || C不起作用,必须为$foo == A || $foo == B || $foo == Cin_array($foo, array(A, B, C))
  2. case语句中不能包含复杂的switch。每个案例只能有一个值,比较值将与之比较。你必须把它写成单独的直通case

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

答案 2 :(得分:0)

您无法使用A == B || C || D语句,只能使用A == B || A == C || A == D

此外,网址可以包含GET参数。

答案 3 :(得分: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)) {
///....