<?php
$regex_url = <<<REGEX
`
(?(DEFINE)
(?<slash_seg> /(?&pchar)* )
(?<pchar> [a-zA-Z\d\-._~!$&'()*+,;=:@%]* )
(?<queryfrag> [a-zA-Z\d\-._~!$&'()*+,;=:@%/?]* )
)
^
(?: (?<scheme> [a-zA-Z][a-zA-Z\d+\-.]* ) :)?
(?:
(?: //
(?: (?<userinfo>
(?<user> [a-zA-Z\d\-._~!$&'()*+,;=%]*)
(?: :(?<pass> [a-zA-Z\d\-._~!$&'()*+,;=%:]*) )?
) @)?
(?<host>
(?<host_name> [a-zA-Z\d\-\.%]+ )
|
(?<ipv4> \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} )
|
(?: \[ (?<ipv6> [a-fA-F\d.:]+ ) \] )
)
(?: :(?<port> \d*) )?
)
(?<path> (?: /(?&pchar)* )* )
|
(?<path_abs> /(?: (?&pchar)+ (?&slash_seg)* )? )
|
(?<path_rel> (?&pchar)+ (?&slash_seg)* )
)?
(?: \? (?<query> (?&queryfrag) ) )?
(?: \# (?<fragment> (?&queryfrag) ) )?
`x
REGEX;
$urls = array(
'scheme://username:password@domain:443/path?query_string#fragment_id',
'http://en.wikipedia.org/wiki/URI#Examples_of_URI_references',
'http://127.0.0.1/ipv4',
'http://[db8:0cec::99:123a]/ipv6',
'http://example.org/absolute/URI/with/absolute/path/to/resource.txt',
'//example.org/scheme-relative/URI/with/absolute/path/to/resource.txt',
'/relative/URI/with/absolute/path/to/resource.txt',
'relative/path/to/resource.txt',
'../../../resource.txt',
'./resource.txt#frag01',
'resource.txt',
'#frag01',
'',
);
foreach($urls as $url) {
preg_match($regex_url, $url, $m);
var_dump($m);
}
preferences:
34.01 ms | 402 KiB | 5 Q