Regex para verificar se o URL válido termina em .jpg, .png ou .gif

Gostaria que os usuários enviassem um URL válido, mas também uma imagem, terminando com .jpg, .png ou .gif.

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

Essa é uma versão (ligeiramente modificada) do regexp de análise URI oficial do RFC 2396 . Ele permite que #fragments e ?querystrings #fragments apareçam após o nome do arquivo, que pode ou não ser o que você deseja. Ele também corresponde a qualquer domínio válido, incluindo localhost , que pode não ser o que você deseja, mas pode ser modificado.

Um regexp mais tradicional para isso pode se parecer com o abaixo.

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

EDIT Veja meu outro comentário , que embora não esteja respondendo a pergunta tão completamente como este, eu sinto que é provavelmente mais útil neste caso. No entanto, estou deixando isso aqui para prostituição de carma razões de perfeição.

Na realidade.

Por que você está verificando o URL? Isso não é garantia do que você vai conseguir é uma imagem, e não garante que as coisas que você está rejeitando não são imagens. Tente executar uma solicitação HEAD e veja qual tipo de conteúdo ela realmente é.

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

Isso irá mach todas as imagens desta string:

 background: rgb(255, 0, 0) url(https://stackoverflow.com/questions/169625/res/img/temp/634043/original/cc3d8715eed0c.jpg) repeat fixed left top; cursor: auto; 
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;

Teste sua regex aqui: https://regex101.com/r/l2Zt7S/1

Em geral, é melhor validar URLs usando funções internas de biblioteca ou estrutura, em vez de rolar suas próprias expressões regulares para fazer isso – consulte Qual é a melhor expressão regular para verificar se uma string é uma URL válida para detalhes.

Se você está interessado em fazer isso, confira esta pergunta:

Obtendo partes de uma URL (Regex)

Então, uma vez que você esteja satisfeito com a URL (por qualquer meio que você tenha usado para validá-la), você pode usar um simples operador de string do tipo “endswith” para verificar a extensão, ou um simples regex como

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

Aqui está a ideia básica em Perl. Sal a gosto.

 #! / usr / bin / perl

 use LWP :: UserAgent;

 meu $ ua = LWP :: UserAgent-> novo;

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

 minha cabeça $ response = $ ua-> ($ ARGV [0]);

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

 print "É uma imagem! \ n" se $ class eq 'image';

Se você precisar inspecionar o URL, use uma biblioteca sólida para ele em vez de tentar lidar com todas as situações estranhas:

 use URI;

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

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

 minha ($ extensão) = $ last = ~ m /\.([^.]+)$/ g;

 print "Minha extensão é $ extensão \ n";

Boa sorte, 🙂

Se você realmente quiser ter certeza, pegar o primeiro quilobyte ou dois do URL fornecido deve ser suficiente para determinar tudo o que você precisa saber sobre a imagem.

Aqui está um exemplo de como você pode obter essa informação , usando Python, e aqui está um exemplo de como usar um campo de formulário do Django que permite validar facilmente a existência de uma imagem, tamanho do arquivo, dimensões e formato, dada sua URL.

(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|gif|png) funcionou muito bem para mim.

Isso corresponderá aos URLs nos seguintes formulários:

 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 

Verifique esta expressão regular em relação aos URLs aqui: http://regexr.com/3g1v7

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

Use FastImage – ele pegará os dados mínimos necessários da URL para determinar se é uma imagem, que tipo de imagem e qual tamanho.

Além da resposta de Dan .

Se houver um endereço IP em vez de domínio.

Altere o regex um pouco. (Solução temporária para IPv4 e IPv6 válidos)

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

No entanto, isso pode ser melhorado, para IPv4 e IPv6 validarem intervalo (s) de sub-rede.

Esta expressão irá corresponder a todos os URLs da imagem –

 ^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+(?:png|jpg|jpeg|gif|svg)+$ 

Exemplos –

Válido –

 https://itelligencegroup.com/wp-content/usermedia/de_home_teaser-box_puzzle_in_the_sun.png http://sweetytextmessages.com/wp-content/uploads/2016/11/9-Happy-Monday-images.jpg example.com/de_home_teaser-box_puzzle_in_the_sun.png www.example.com/de_home_teaser-box_puzzle_in_the_sun.png https://www.greetingseveryday.com/wp-content/uploads/2016/08/Happy-Independence-Day-Greetings-Cards-Pictures-in-Urdu-Marathi-1.jpg http://thuglifememe.com/wp-content/uploads/2017/12/Top-Happy-tuesday-quotes-1.jpg https://1.bp.blogspot.com/-ejYG9pr06O4/Wlhn48nx9cI/AAAAAAAAC7s/gAVN3tEV3NYiNPuE-Qpr05TpqLiG79tEQCLcBGAs/s1600/Republic-Day-2017-Wallpapers.jpg 

Inválido –

 https://www.example.com http://www.example.com www.example.com example.com http://blog.example.com http://www.example.com/product http://www.example.com/products?id=1&page=2 http://www.example.com#up http://255.255.255.255 255.255.255.255 http://invalid.com/perl.cgi?key= | http://web-site.com/cgi-bin/perl.cgi?key1=value1&key2 http://www.siteabcd.com:8008