Подтвердить что ты не робот

Regex для проверки правильности URL-адреса, который заканчивается на .jpg,.png или .gif

Я хочу, чтобы пользователи отправляли URL-адрес, который является действительным, но также является изображением, заканчивающимся на .jpg,.png или .gif.

4b9b3361

Ответ 1

(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*\.(?:jpg|gif|png))(?:\?([^#]*))?(?:#(.*))?

Это (слегка измененная) версия официального URI, анализирующего регулярное выражение из RFC 2396. Он позволяет #fragments и ?querystrings появляться после имени файла, что может быть или не быть тем, что вы хотите. Он также соответствует любому действительному домену, включая localhost, который снова может быть не таким, каким вы хотите, но его можно изменить.

Более традиционное регулярное выражение для этого может выглядеть следующим образом.

^https?://(?:[a-z0-9\-]+\.)+[a-z]{2,6}(?:/[^/#?]+)+\.(?:jpg|gif|png)$
          |-------- domain -----------|--- path ---|-- extension ---|

EDIT См. мой комментарий , который хотя и не отвечает на этот вопрос полностью, как этот, я чувствую, что это, вероятно, больше полезно в этом случае. Тем не менее, я оставляю это здесь для причин полноты karma-whoring.

Ответ 2

На самом деле.

Почему вы проверяете URL? Это не гарантирует, что вы собираетесь получить изображение, и не гарантирует, что вещи, которые вы отвергаете, не являются изображениями. Попробуйте выполнить запрос HEAD на нем и посмотрите, какой тип содержимого он на самом деле.

Ответ 3

В общем, вам лучше не проверять URL-адреса, используя встроенную библиотеку или функции фреймворка, а не перематывать собственные регулярные выражения, чтобы сделать это - см. Какое лучшее регулярное выражение для проверки правильности строки для.

Если вы увлекаетесь этим, проверьте этот вопрос:

Получение частей URL (Regex)

Затем, как только вы удовлетворены URL-адресом (каким бы способом вы его не проверяли), вы можете использовать простой оператор типа "endswith" для проверки расширения или простого регулярного выражения, например

(?i)\.(jpg|png|gif)$

Ответ 4

(http(s?):)|([/|.|\w|\s])*\.(?:jpg|gif|png)

Это будет обрабатывать все изображения из этой строки:

background: rgb(255, 0, 0) url(../res/img/temp/634043/original/cc3d8715eed0c.jpg) repeat fixed left top; cursor: auto;
<div id="divbg" style="background-color:#ff0000"><img id="bg" src="../res/img/temp/634043/original/cc3d8715eed0c.jpg" width="100%" height="100%" /></div>
background-image: url(../res/img/temp/634043/original/cc3d8715eed0c.png);
background: rgb(255, 0, 0) url(http://google.com/res/../img/temp/634043/original/cc3    _d8715eed0c.jpg) repeat fixed left top; cursor: auto;
background: rgb(255, 0, 0) url(https://google.com/res/../img/temp/634043/original/cc3_d8715eed0c.jpg) repeat fixed left top; cursor: auto;

Проверьте ваше регулярное выражение здесь: https://regex101.com/r/l2Zt7S/1

Ответ 5

Вот основная идея в Perl. Соль по вкусу.

#!/usr/bin/perl

use LWP::UserAgent;

my $ua = LWP::UserAgent->new;

@ARGV = qw(http://www.example.com/logo.png);

my $response = $ua->head( $ARGV[0] );

my( $class, $type ) = split m|/|, lc $response->content_type;

print "It an image!\n" if $class eq 'image';

Если вам нужно проверить URL-адрес, используйте для него сплошную библиотеку, а не пытайтесь самостоятельно обрабатывать все нечетные ситуации:

use URI;

my $uri = URI->new( $ARGV[0] );

my $last = ( $uri->path_segments )[-1];

my( $extension ) = $last =~ m/\.([^.]+)$/g;

print "My extension is $extension\n";

Удачи,:)

Ответ 6

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

Здесь пример того, как вы можете получить эту информацию, используя Python, и здесь пример его использования в качестве поля формы Django, который позволяет легко проверять существование, размер файла и формат изображения, учитывая его URL.

Ответ 7

^((http(s?)\:\/\/|~/|/)?([\w]+:\[email protected])?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.(jpg|png|gif))

Ответ 8

Используйте FastImage - он будет получать минимальные требуемые данные из URL-адреса, чтобы определить, является ли это образ, какой тип изображения и какой размер.

Ответ 9

Дополнение к Ответу Дана.

Если вместо домена есть IP-адрес.

Изменить регулярное выражение. (Временное решение для действительных IPv4 и IPv6)

^https?://(?:[a-z0-9\-]+\.)+[a-z0-9]{2,6}(?:/[^/#?]+)+\.(?:jpg|gif|png)$

Однако это можно улучшить, чтобы IPv4 и IPv6 проверяли диапазон подсети.

Ответ 10

(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|gif|png) работал очень хорошо для меня.

Это будет соответствовать URL-адресам в следующих формах:

https://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.jpg
http://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.jpg
https://farm4.staticflickr.com/3894/15008518202-c265dfa55f-h.jpg
https://farm4.staticflickr.com/3894/15008518202.c265dfa55f.h.jpg
https://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.gif
http://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.gif
https://farm4.staticflickr.com/3894/15008518202-c265dfa55f-h.gif
https://farm4.staticflickr.com/3894/15008518202.c265dfa55f.h.gif
https://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.png
http://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.png
https://farm4.staticflickr.com/3894/15008518202-c265dfa55f-h.png
https://farm4.staticflickr.com/3894/15008518202.c265dfa55f.h.png

Проверьте это регулярное выражение на URL-адреса здесь: http://regexr.com/3g1v7