use 5.010;
use strict;
use warnings;
my $text = do { local $/ = <DATA> };
my ($start, $end) = map quotemeta, qw([img] [/img]);
$text =~ s{($start(.+?)$end)}{
my $link = $1;
my $uri = $2;
$uri =~ /\.(?:jpe?g|png|svg|gif|bmp)$/ ? $link : 'Invalid'
}eg;
print $text;
__DATA__
Foo
[img]http://example.com/[/img]
Bar
[img]http://example.com/logo.jpeg[/img]
That said, what you are doing is conceptually broken. It is perfectly valid for an image on the web to have a URL ending with ".cgi", ".php", or even ".html". Whether something is an image or not is decided by its HTTP Content-Type header, not by the last few characters of the URL.
perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
/p |