Регулярно проверяйте, чтобы действительный URL заканчивался на .jpg, .png или .gif - PullRequest
30 голосов
/ 04 октября 2008

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

Ответы [ 12 ]

69 голосов
/ 04 октября 2008
(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*\.(?:jpg|gif|png))(?:\?([^#]*))?(?:#(.*))?

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

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

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

РЕДАКТИРОВАТЬ См. Мой другой комментарий , который, хотя и не отвечает на вопрос так же полно, как этот, я чувствую, что это, вероятно, более полезно в этом случае Тем не менее, я оставляю это здесь по причинам кармы по причинам полноты.

37 голосов
/ 04 октября 2008

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

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

13 голосов
/ 18 сентября 2009
(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

13 голосов
/ 04 октября 2008

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

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

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

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

(?i)\.(jpg|png|gif)$
2 голосов
/ 04 октября 2008

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

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

2 голосов
/ 04 октября 2008

Вот основная идея в 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's 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";

Удачи,:)

1 голос
/ 04 октября 2008
^((http(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.(jpg|png|gif))
0 голосов
/ 15 марта 2019

Ссылка: см. Раздел DecodeConfig на официальном go lang image lib docs здесь

Я полагаю, что вы также можете использовать DecodeConfig, чтобы получить формат изображения, который вы затем сможете проверить по константным типам, таким как jpeg, png, jpg и gif, т.е.

import (
  "encoding/base64"
  "fmt"
  "image"
  "log"
  "strings"
  "net/http"

  // Package image/jpeg is not used explicitly in the code below,
  // but is imported for its initialization side-effect, which allows
  // image.Decode to understand JPEG formatted images. Uncomment these
  // two lines to also understand GIF and PNG images:
  // _ "image/gif"
  // _ "image/png"
  _ "image/jpeg"
   )

func main() {
  resp, err := http.Get("http://i.imgur.com/Peq1U1u.jpg")
  if err != nil {
      log.Fatal(err)
  }
  defer resp.Body.Close()
  data, _, err := image.Decode(resp.Body)
  if err != nil {
      log.Fatal(err)
  }
  reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data))
  config, format, err := image.DecodeConfig(reader)
  if err != nil {
      log.Fatal(err)
  }
  fmt.Println("Width:", config.Width, "Height:", config.Height, "Format:", format)
}

формат здесь представляет собой строку, которая указывает формат файла, например, jpg, png и т. Д.

0 голосов
/ 24 июля 2018

Это выражение будет соответствовать всем URL-адресам изображений -

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

Примеры -

Действительный -

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

Недействительно -

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...