#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:
$foo == A || B || C
не работает, это должно быть$foo == A || $foo == B || $foo == C
илиin_array($foo, array(A, B, C))
.-
У вас не может быть сложных
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)) { ///....