Fo.*_*Fo. 0 php regex url parsing
这个功能很棒,但它的主要缺点是它不处理以.co.uk或.com.au结尾的域.如何修改它来处理这个?
function parseUrl($url) {
$r = "^(?:(?P<scheme>\w+)://)?";
$r .= "(?:(?P<login>\w+):(?P<pass>\w+)@)?";
$r .= "(?P<host>(?:(?P<subdomain>[-\w\.]+)\.)?" . "(?P<domain>[-\w]+\.(?P<extension>\w+)))";
$r .= "(?::(?P<port>\d+))?";
$r .= "(?P<path>[\w/-]*/(?P<file>[\w-]+(?:\.\w+)?)?)?";
$r .= "(?:\?(?P<arg>[\w=&]+))?";
$r .= "(?:#(?P<anchor>\w+))?";
$r = "!$r!";
preg_match ( $r, $url, $out );
return $out;
}
Run Code Online (Sandbox Code Playgroud)
为了澄清我寻找除parse_url()以外的东西的原因是我想剥离(可能是多个)子域.
print_r(parse_url('sub1.sub2.test.co.uk'));
Run Code Online (Sandbox Code Playgroud)
结果是:
Array(
[scheme] => http
[host] => sub1.sub2.test.co.uk
)
Run Code Online (Sandbox Code Playgroud)
我想提取的是"test.co.uk"(没有子域名),所以首先使用parse_url是一个毫无意义的额外步骤,其中输出与输入相同.
内置的parse_url有什么问题?