Как я могу убедиться, что одна вещь соответствует, а другая нет в одном регулярном выражении? - PullRequest
1 голос
/ 10 июля 2009

Это просто, но я беру полный список каталогов (в PHP с dir()) и проверяю оба:

  • не "." или ".." и
  • заканчивается расширением файла .jpg, .jpeg, .gif или .png.

Прямо сейчас у меня есть

function isValidFile($filename) {
    $dirDotExpr = "/^\.{1,2}$/"; //matches against "." and ".."
    $extExpr = "/\.(jpg|jpeg|gif|png)$/i"; //checks file extension

    return (1
        && ! preg_match($dirDotExpr, $filename)
        && preg_match($extExpr, $filename)
    )
}

но было бы неплохо сделать все это в одном регулярном выражении. Тем не менее, я не знаю, как сделать так, чтобы одно совпадало, а одно нет - как я могу это сделать?

Ответы [ 3 ]

6 голосов
/ 10 июля 2009

Вы, возможно, думаете об этом. Если вы проверяете, что $filename заканчивается на .jpg, .jpeg, .gif или .png, это явно не может быть "." или "..".

1 голос
/ 10 июля 2009
function isValidFile($filename)
{
    return (bool) preg_match('/\.(?:jpe?g|gif|png)$/iD', (string) $filename);
}

Обратите внимание, что я сделал скобки без захвата, для небольшого увеличения скорости. Также объединены jpg и jpeg в jpe?g. Также я добавил модификатор D. Если вы этого не сделаете, $ разрешит финальные переводы строк; имя файла вроде "hello.jpg \ n" будет считаться действительным. Будьте в курсе этого.

0 голосов
/ 10 июля 2009

Если вы не хотите разрешать точки в имени файла (кроме разделителя имени и расширения): ^ [^ \ x2E] + \ x2E (jpg | jpeg | gif | png) $

Если вы разрешите использовать точки (имя из нескольких частей): ^ ([^ \ x2E] + \ x2E) + (jpg | jpeg | gif | png) $

Конвертировать в PHP по мере необходимости ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...