package Regexp::Pattern::URI;
our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
our $DATE = '2021-07-01'; # DATE
our $DIST = 'Regexp-Pattern-URI'; # DIST
our $VERSION = '0.001'; # VERSION
use 5.010001;
use strict;
use warnings;
our %RE;
$RE{http} = {
summary => 'Match an http/https URL',
pat => qr{(?:(?:https?)://(?:(?:(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]|[a-zA-Z])[.]?)|(?:[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+)))(?::(?:(?:[0-9]*)))?(?:/(?:(?:(?:(?:(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+\$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*)(?:;(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+\$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))*)(?:/(?:(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+\$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*)(?:;(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+\$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))*))*))(?:[?](?:(?:(?:[;/?:@&=+\$,a-zA-Z0-9\-_.!~*'()]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*)))?))?)}, # from Regexp::Common {URI}{HTTP} modified to support https
examples => [
{str=>'http://www.example.org/foo', matches=>1},
{str=>'ftp://www.example.org/foo', matches=>0},
{str=>'[email protected]', matches=>0},
],
};
$RE{file} = {
summary => 'Match a file:// URL',
pat => qr{(?:(?:file)://(?:(?:(?:(?:(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]|[a-zA-Z]))|(?:[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+))|localhost)?)(?:/(?:(?:(?:(?:[-a-zA-Z0-9\$_.+!*'(),:@&=]|(?:%[a-fA-F0-9][a-fA-F0-9]))*)(?:/(?:(?:[-a-zA-Z0-9\$_.+!*'(),:@&=]|(?:%[a-fA-F0-9][a-fA-F0-9]))*))*)))))}, # from Regexp::Common {URI}{file}
examples => [
{str=>'file://foo/bar.txt', matches=>1},
{str=>'ftp://www.example.org/foo', matches=>0},
{str=>'foo/bar.txt', matches=>0},
],
};
$RE{ftp} = {
summary => 'Match an ftp:// URL',
pat => qr{(?:(?:ftps?|sftp)://(?:(?:(?:(?:[a-zA-Z0-9\-_.!~*'();:&=+\$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))(?:)@)?(?:(?:(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]|[a-zA-Z])[.]?)|(?:[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+)))(?::(?:(?:[0-9]*)))?(?:/(?:(?:(?:(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+\$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*)(?:/(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+\$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))*))(?:;type=(?:[AIai]))?))?)}, # from Regexp::Common {URI}{FTP}
examples => [
{str=>'ftp://www.example.org/foo', matches=>1},
{str=>'http://www.example.org/foo', matches=>0},
{str=>'foo/bar.txt', matches=>0},
],
};
$RE{ssh} = {
summary => 'Match an ssh:// URL',
pat => qr{(?:(?:ssh)://(?:(?:(?:(?:[a-zA-Z0-9\-_.!~*'();:&=+\$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))(?:)@)?(?:(?:(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]|[a-zA-Z])[.]?)|(?:[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+)))(?::(?:(?:[0-9]*)))?(?:/(?:(?:(?:(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+\$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*)(?:/(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+\$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))*))(?:;type=(?:[AIai]))?))?)}, # from Regexp::Common {URI}{FTP} modified
examples => [
{str=>'ssh://user:[email protected]:/foo/bar.git', matches=>1},
{str=>'http://www.example.org/foo', matches=>0},
{str=>'foo/bar.txt', matches=>0},
],
};
1;
# ABSTRACT: Regexp patterns related to URI
__END__
=pod
=encoding UTF-8
=head1 NAME
Regexp::Pattern::URI - Regexp patterns related to URI
=head1 VERSION
This document describes version 0.001 of Regexp::Pattern::URI (from Perl distribution Regexp-Pattern-URI), released on 2021-07-01.
=head1 SYNOPSIS
use Regexp::Pattern; # exports re()
my $re = re("URI::file");
=head1 DESCRIPTION
This is currently a repackaging (lower startup-overhead version) of some of the
regexes in L<Regexp::Common::URI>.
=head1 REGEXP PATTERNS
=over
=item * file
Match a file:E<sol>E<sol> URL.
Examples:
Example #1.
"file://foo/bar.txt" =~ re("URI::file"); # matches
Example #2.
"ftp://www.example.org/foo" =~ re("URI::file"); # DOESN'T MATCH
Example #3.
"foo/bar.txt" =~ re("URI::file"); # DOESN'T MATCH
=item * ftp
Match an ftp:E<sol>E<sol> URL.
Examples:
Example #1.
"ftp://www.example.org/foo" =~ re("URI::ftp"); # matches
Example #2.
"http://www.example.org/foo" =~ re("URI::ftp"); # DOESN'T MATCH
Example #3.
"foo/bar.txt" =~ re("URI::ftp"); # DOESN'T MATCH
=item * http
Match an httpE<sol>https URL.
Examples:
Example #1.
"http://www.example.org/foo" =~ re("URI::http"); # matches
Example #2.
"ftp://www.example.org/foo" =~ re("URI::http"); # DOESN'T MATCH
Example #3.
"foo\@example.org" =~ re("URI::http"); # DOESN'T MATCH
=item * ssh
Match an ssh:E<sol>E<sol> URL.
Examples:
Example #1.
"ssh://user:pass\@example.org:/foo/bar.git" =~ re("URI::ssh"); # matches
Example #2.
"http://www.example.org/foo" =~ re("URI::ssh"); # DOESN'T MATCH
Example #3.
"foo/bar.txt" =~ re("URI::ssh"); # DOESN'T MATCH
=back
=head1 HOMEPAGE
Please visit the project's homepage at L<https://metacpan.org/release/Regexp-Pattern-URI>.
=head1 SOURCE
Source repository is at L<https://github.com/perlancar/perl-Regexp-Pattern-URI>.
=head1 BUGS
Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Regexp-Pattern-URI>
When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.
=head1 SEE ALSO
L<Regexp::Common>, particularly L<Regexp::Common::URI>
L<Regexp::Pattern>
Some utilities related to Regexp::Pattern: L<App::RegexpPatternUtils>, L<rpgrep> from L<App::rpgrep>.
=head1 AUTHOR
perlancar <[email protected]>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2021 by [email protected].
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut