проблема в случае переключения

#php #regex #switch-statement

#php #регулярное выражение #switch-инструкция

Вопрос:

как это исправить или добавить регулярное выражение?

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

Комментарии:

1. Чувствительна ли проверка к регистру? http://example.com/icon.JPG Как насчет параметров запроса? http://example.com/icon.jpg?src=search Как насчет других страниц? http://example.com/evil#justlookslegit.jpg

2. Попробуйте strrchr($rrr["url"], ".") получить расширение.

Ответ №1:

Что-то вроде этого?

 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.Если это действительно используется как switch case , это будет работать не так, как вы ожидаете. Если это вообще работает, то только потому, что результат этого выражения слабо сравнивается со switch значением сравнения.

2. @deceze: Спрашивающий опустил switch($expr) -часть, поэтому мне пришлось угадывать. Может быть, это просто switch(true) .

3. @King Конечно, но это было бы так же странно, и на это нужно указать.

4. @deceze: Хм .. верное замечание. Возможно, я немного переборщил. Но что странного в switch(true) ?

5. @King IMO switch(true) злоупотребляет switch инструкцией и было бы лучше заменить на if . Хотя, возможно, это только у меня.

Ответ №2:

  1. $foo == A || B || C не работает, это должно быть $foo == A || $foo == B || $foo == C или in_array($foo, array(A, B, C)) .
  2. У вас не может быть сложных case s внутри switch инструкций. Каждый случай может иметь только одно значение, с которым будет сравниваться значение сравнения. Вам пришлось бы записать это как отдельные промежуточные case варианты:

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

Ответ №3:

Вы не можете использовать A == B || C || D оператор для этого, только A == B || A == C || A == D

Кроме того, URL-адреса могут иметь параметры GET.

Ответ №4:

Вам нужно найти strrpos точки, получить подстроку после наименьшего положения точки (которое возвращает strrpos), определить массив разрешенных расширений (это также делает ваш код повторно используемым), а затем использовать in_array следующим образом:

$rpos = strrpos($rrr['url'], '.');
$ext = substr($rrr['url'], $ rpos  1);
$allowedExtensions = массив ('jpg','png', 'gif', 'tif', 'tiff');
///....
if (in_array($ext, $allowedExtensions)) {
///....