Php 开关箱上的问题

Php 开关箱上的问题,php,regex,switch-statement,Php,Regex,Switch Statement,如何修复或添加regexp case substr($rrr['url'],-4)=='.jpg' || '.png' || '.gif' || '.tif' || '.tiff': 像这样的 case in_array(substr($rrr['url'],-4), array('.jpg','.png','.gif','.tif')): case in_array(substr($rrr['url'],-5), array('.tiff')): 注意,我省略了break;在大小写表达式

如何修复或添加regexp

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

case in_array(substr($rrr['url'],-4), array('.jpg','.png','.gif','.tif')):
case in_array(substr($rrr['url'],-5), array('.tiff')):
注意,我省略了break;在大小写表达式之间

也很酷:

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;
}
你不能用A==B | | C | D语句,只有A==B | | A==C | A==D

此外,URL可以具有GET参数

$foo==A | | B | | C不起作用,这需要是$foo==A | | |$foo==B | |$foo==C或在_数组中$foo,arrayA,B,C。 switch语句中不能有复杂的情况。每个案例只能有一个值,比较值将与之进行比较。您必须将此作为单独的失败案例来编写:

您需要找到点的位置,在strrpos返回的最右边的点位置后获得子字符串,定义允许的扩展数组,这也使您的代码可重用,然后像这样使用:

$rpos = strrpos($rrr['url'], '.'); $ext = substr($rrr['url'], $rpos+1); $allowedExtensions = array('jpg','png', 'gif', 'tif', 'tiff'); ///.... if (in_array($ext, $allowedExtensions)) { ///....
支票区分大小写吗?http://example.com/icon.JPG 查询参数呢?http://example.com/icon.jpg?src=search 其他页面呢?http://example.com/eviljustlookslegit.jpgTry strrchr$rrr[url]。如果这确实被用作开关盒,它将不会像您期望的那样工作。如果它能工作,那只是因为该表达式的结果恰好与开关比较值比较松散。@deceze:提问者省略了开关$expr部分,所以我不得不猜测。也许这是真的。@King当然,但那也很奇怪,需要指出。@deceze:Hmm。。正确的观点。也许我猜得太多了。但是switchtrue有什么奇怪之处呢?@King-IMO-switchtrue滥用switch语句,最好用if替换。也许那只是我。 $rpos = strrpos($rrr['url'], '.'); $ext = substr($rrr['url'], $rpos+1); $allowedExtensions = array('jpg','png', 'gif', 'tif', 'tiff'); ///.... if (in_array($ext, $allowedExtensions)) { ///....