Regexp для img (jpg, jpeg, png)

234
29 декабря 2017, 01:30

Нужно регулярное выражение для проверки url картинки, т.е. что бы:

1) url начинался на https (хотя я не уверена, нужно ли это)

2) заканчивался на jpg, jpeg, png

Если я что-то пропустила, то подскажите, пожалуйста.

Я пыталась использовать вот что:

if (preg_match('http(s ?):)|([/|.|\w | \s])*\.(?:jpg | jpeg | png', $_POST['url']))

Но что-то идет нет так.

Answer 1

" Спасибо, а то я совсем не разбираюсь в этих регулярках "

Самое время начинать. Давайте разберём regex-шаблон конкретно для вашей задачи (я не буду заключать его в апострофы, т.к. как записываются строки в PHP вам уже известно):

~^https?://\S+(?:jpg|jpeg|png)$~

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

~^https?://\S+(?:jpg|jpeg|png)$~
^                              ^

Следующий после открывающего ограничителя символ ^ (так называемая "крышка") сообщает о том, что эта позиция подстроки должна соответствовать началу строки (т.е., слева от "крышки" не должно быть никаких символов)

~^https?://\S+(?:jpg|jpeg|png)$~
 ^

Далее идут пять букв https, означающих сами себя, и квантификатор ?, действие которого относится к предшествующему его символу s. Квантификатор ? служит для ограничения символов (в данном случае, его действие распространяется на букву s), и говорит о том, что символ s может находиться в указанной позиции 0 или 1 раз (иначе говоря, символ s не обязателен, подстрока 'http' без 's' так же будет соответствовать шаблону)

Следующие три символа подстроки :// означают сами себя, и в объяснении не нуждаются.

Нам известно, что валидные URL-адреса не могут содержать пробелов - возьмём это за основу, и после двойных слешей запишем метасимвол \S, означающий любой символ, кроме пробела (не пробел)

~^https?://\S+(?:jpg|jpeg|png)$~
           ^^

Следующий за ним квантификатор + (плюс) говорит о том, что не пробел в текущей позиции является обязательным, и может встречаться в подстроке 1 или более раз

~^https?://\S+(?:jpg|jpeg|png)$~
             ^

После "обязательного" квантификатора + записана группа подстрок, заключённых в не сохраняющие скобки (?:...)

~^https?://\S+(?:jpg|jpeg|png)$~
              ^^^            ^

Не сохраняющие скобки отличаются от обычных тем, что совпавший внутри них текст не захватывается механизмом регулярных выражений, и не может быть использован, как ссылка на эту группу (подмаску). Не сохраняющие скобки служат для ограничения группы альтернативного выбора (ИЛИ "|")

(?:jpg|jpeg|png)
      ^    ^

Ну и последний метасимвол - $ (знак доллара) служит для ограничения шаблона, и обозначает конец подстроки. Иначе говоря, после него не должно быть никаких символов, кроме символа конца строки

~^https?://\S+(?:jpg|jpeg|png)$~
                              ^

Итак, этот шаблон можно прочитать так: строка соответствует шаблону, если:

  1. она начинается с подстроки http
  2. за которой следует не обязательный литерал s
  3. после которого записаны три символа ://
  4. после которых записан один или более не пробельных символов \S
  5. после которых строка должна закончиться одним из расширений: jpg или jpeg или png
READ ALSO
Как поменять слова местами в переменной (PHP)

Как поменять слова местами в переменной (PHP)

Всегда содержит два слова temp1 temp2

253
База данных WordPress возвратила ошибку Server shutdown in progress

База данных WordPress возвратила ошибку Server shutdown in progress

Написан парсерПри вносе в базу данных чем больше она становится тем медленнее грузится

215
Регистрация и авторизация на сайте php

Регистрация и авторизация на сайте php

Пишу биржу телеграм, столкнулся с такой проблемой: для некоторых действий на сайте нужно сначала войти в системуКак сделать, чтобы при переходе...

266
ООП vs ФП (PHP)

ООП vs ФП (PHP)

Собираюсь писать довольно большой проект именно на PHPНикак не могу выбрать, что же лучше подойдет функциональный стиль или же ООП

235