.jpg、.png、または .gif で終わる、有効で画像でもある URL をユーザーに送信してもらいたいと思います。
14 に答える
(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*\.(?:jpg|gif|png) )(?:\?([^#]*))?(?:#(.*))?
これは、 RFC 2396の公式の URI 解析正規表現の (わずかに変更された) バージョンです。#fragments
ファイル名の後にandを表示でき?querystrings
ますが、これは必要な場合とそうでない場合があります。また、 を含む任意の有効なドメインとも一致しますlocalhost
が、これも望ましくない可能性がありますが、変更される可能性があります。
このためのより伝統的な正規表現は、以下のようになります。
^https?://(?:[a-z0-9\-]+\.)+[az]{2,6}(?:/[^/#?]+)+\.(?:jpg |gif|png)$ |-------- ドメイン -----------|--- パス ---|-- 拡張子 ---|
編集私の他のコメントを参照してください。これは、この質問ほど完全には答えていませんが、この場合はおそらくより便利だと思います。しかし、私はこれをここに残しておきますカルマ娼婦完全性の理由。
実際。
なぜURLをチェックしているのですか?それはあなたが得ようとしているものが画像であるという保証ではなく、あなたが拒否しようとしているものが画像ではないという保証でもありません. その上で HEAD リクエストを実行してみて、実際の content-type を確認してください。
一般に、これを行うために独自の正規表現をローリングするよりも、組み込みのライブラリまたはフレームワーク関数を使用して URL を検証することをお勧めします。
ただし、これを行うことに熱心な場合は、次の質問を確認してください。
次に、(検証に使用した方法で) URL に満足したら、単純な「endswith」タイプの文字列演算子を使用して拡張子を確認するか、次のような単純な正規表現を使用できます。
(?i)\.(jpg|png|gif)$
(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
本当に確認したい場合は、指定された URL の最初の 1 ~ 2 キロバイトを取得するだけで、画像について知る必要があるすべてを判断できます。
Python を使用してその情報を取得する方法の例を次に示します。URL を指定して、画像の存在、ファイルサイズ、サイズ、および形式を簡単に検証できるDjango フォーム フィールドとして使用する例を次に示します。
これが Perl の基本的な考え方です。味に塩。
#!/usr/bin/perl LWP::UserAgent を使用します。 my $ua = LWP::UserAgent->new; @ARGV = qw(http://www.example.com/logo.png); 私の $response = $ua->head( $ARGV[0] ); my( $class, $type ) = split m|/|, lc $response->content_type; print "画像です!\n" if $class eq 'image';
URL を検査する必要がある場合は、すべての奇妙な状況を自分で処理しようとするのではなく、しっかりしたライブラリを使用してください。
URI を使用します。 私の $uri = URI->new( $ARGV[0] ); 私の $last = ( $uri->path_segments )[-1]; my( $extension ) = $last =~ m/\.([^.]+)$/g; print "私の拡張子は $extension です\n";
幸運を、 :)
ダンの回答への追加。
ドメインの代わりに IP アドレスがある場合。
正規表現を少し変更します。(有効な IPv4 および IPv6 の一時的な解決策)
^https?://(?:[a-z0-9\-]+\.)+[a-z0-9]{2,6}(?:/[^/#?]+)+\.(?:jpg|gif|png)$
ただし、IPv4 および IPv6 でサブネット範囲を検証するために、これを改善することができます。
FastImageを使用します。URL から最低限必要なデータを取得して、画像かどうか、画像の種類とサイズを判断します。
^((http(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.(jpg|png|gif))
参照: 公式の go lang イメージ lib ドキュメントの DecodeConfig セクションを参照してください。
DecodeConfig を使用して画像の形式を取得し、それを jpeg、png、jpg、gif などの const タイプに対して検証することもできると思います。
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)
}
ここでの format は、ファイル形式を示す文字列です (例: jpg、png など)。