如何使这个PHP URL解析功能近乎完美?

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是一个毫无意义的额外步骤,其中输出与输入相同.

tim*_*dev 9

内置的parse_url有什么问题?

  • 嗯,既然parse_url为你提供了主机名,为什么不写一个(更简单的)表达式来拆分子域和扩展名呢? (4认同)
  • @Fo为什么不使用parse_url进行初始解析并对它返回的主机名执行进一步的解析? (2认同)