Regex per verificare se l’URL valido termina con .jpg, .png o .gif

Vorrei che gli utenti presentassero un URL valido ma anche un’immagine, che termina con .jpg, .png o .gif.

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

Questa è una versione (leggermente modificata) dell’URI ufficiale che analizza regexp da RFC 2396 . Permette di #fragments e ?querystrings #fragments di apparire dopo il nome del file, che può o non può essere quello che vuoi. Corrisponde anche a qualsiasi dominio valido, incluso localhost , che potrebbe non essere quello che desideri, ma potrebbe essere modificato.

Una regexp più tradizionale per questo potrebbe sembrare il seguente.

  ^ Https: //?.? (:?. [A-z0-9 \ -] + \) + [az] {2,6} (:? [? ^ / #] / +) + \ (: Jpg | gif | png) $
           | -------- dominio ----------- | --- percorso --- | - estensione --- | 

EDIT Vedi il mio altro commento , che sebbene non risponda alla domanda completamente come questo, ritengo che sia probabilmente più utile in questo caso. Tuttavia, sto lasciando questo qui per il karma-prostituirsi ragioni di completezza

In realtà.

Perché stai controllando l’URL? Non è una garanzia che quello che otterrai è un’immagine, e non è garantito che le cose che stai rifiutando non siano immagini. Prova a eseguire una richiesta HEAD su di esso e guarda quale tipo di contenuto è effettivamente .

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

Questo macchierà tutte le immagini da questa stringa:

 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;

Metti alla prova la tua espressione regolare qui: https://regex101.com/r/l2Zt7S/1

In generale, è meglio convalidare gli URL utilizzando la libreria o le funzioni di framework incorporate, piuttosto che eseguire le proprie espressioni regolari per fare ciò: vedere Qual è la migliore espressione regolare per verificare se una stringa è un URL valido per i dettagli.

Se ti piace farlo, dai un’occhiata a questa domanda:

Ottenere parti di un URL (Regex)

Quindi, una volta che sei soddisfatto dell’URL (con qualsiasi mezzo tu abbia usato per convalidarlo), potresti utilizzare un semplice operatore di stringa di tipo “endswith” per controllare l’estensione, o una semplice regex come

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

Ecco l’idea di base in Perl. Sale a piacere

 #! / Usr / bin / perl

 utilizzare 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 "È un'immagine! \ n" se $ class eq 'image';

Se hai bisogno di ispezionare l’URL, usa una libreria solida per questo piuttosto che provare a gestire tutte le situazioni dispari:

 utilizzare l'URI;

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

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

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

 print "La mia estensione è $ estensione \ n";

In bocca al lupo, 🙂

Se vuoi essere sicuro, afferrare il primo kilobyte o due dell’URL indicato dovrebbe essere sufficiente per determinare tutto ciò che devi sapere sull’immagine.

Ecco un esempio di come è ansible ottenere tali informazioni , usando Python, ed ecco un esempio di come viene utilizzato, come un campo di forma di Django che consente di convalidare facilmente l’esistenza, la dimensione, il formato e il formato di un’immagine, dato il suo URL.

(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|gif|png) funzionato molto bene per me.

Questo corrisponderà agli URL nelle seguenti forms:

 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 

Controlla questa espressione regolare contro gli URL qui: http://regexr.com/3g1v7

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

Usa FastImage : acquisirà i dati minimi richiesti dall’URL per determinare se si tratta di un’immagine, di quale tipo di immagine e di quale dimensione.

Aggiunta alla risposta di Dan .

Se c’è un indirizzo IP invece del dominio.

Cambia regex un po ‘. (Soluzione temporanea per IPv4 e IPv6 validi)

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

Tuttavia, questo può essere migliorato, per IPv4 e IPv6 per convalidare gli intervalli di substring.

Questa espressione corrisponderà a tutti gli URL delle immagini:

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

Esempi –

Valido –

 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 

Non valido –

 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