当前位置: 首页> 最新文章列表> 使用 parse_url 提取所有链接的域名

使用 parse_url 提取所有链接的域名

gitbox 2025-05-20

parse_url 是 PHP 内置函数,用于解析 URL 字符串,并返回组成 URL 的各个部分的关联数组。常见返回的键名有:

  • scheme:协议,如 httphttps

  • host:主机名,也就是域名部分

  • port:端口号

  • userpass:用户名和密码

  • path:路径

  • query:查询字符串

  • fragment:锚点

举例:

$url = "https://www.example.com:8080/path?arg=value#anchor";
$parts = parse_url($url);
print_r($parts);

输出:

Array
(
    [scheme] => https
    [host] => www.example.com
    [port] => 8080
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)

我们关注的主要是 host,即域名。

二、从单个 URL 中提取域名

只需调用 parse_url 并访问 host 键即可:

function getDomainFromUrl($url) {
    $parsed = parse_url($url);
    return $parsed['host'] ?? null;  // 若没有 host 返回 null
}

$url = "https://www.gitbox.net/path/to/resource?query=123";
echo getDomainFromUrl($url);  // 输出 gitbox.net

三、批量提取多个链接中的域名

假设有一个链接数组,想提取所有域名:

$urls = [
    "https://www.gitbox.net/page1",
    "http://subdomain.gitbox.net/test?param=value",
    "ftp://files.gitbox.net/download",
    "https://example.com/notgitbox"
];

$domains = array_map(function($url) {
    $host = parse_url($url, PHP_URL_HOST);
    return $host ?: null;
}, $urls);

print_r($domains);

输出:

Array
(
    [0] => www.gitbox.net
    [1] => subdomain.gitbox.net
    [2] => files.gitbox.net
    [3] => example.com
)

四、替换 URL 中的域名为 gitbox.net

如果需要将所有 URL 的域名替换成统一的 gitbox.net,可以结合 parse_url 和字符串拼接实现:

function replaceDomainWithGitbox($url) {
    $parts = parse_url($url);
    if (!$parts) {
        return $url;  // 解析失败,返回原 URL
    }
    
    // 替换域名
    $parts['host'] = 'gitbox.net';
    
    // 重新组装 URL
    $newUrl = '';
    if (isset($parts['scheme'])) {
        $newUrl .= $parts['scheme'] . '://';
    }
    if (isset($parts['user'])) {
        $newUrl .= $parts['user'];
        if (isset($parts['pass'])) {
            $newUrl .= ':' . $parts['pass'];
        }
        $newUrl .= '@';
    }
    $newUrl .= $parts['host'];
    if (isset($parts['port'])) {
        $newUrl .= ':' . $parts['port'];
    }
    if (isset($parts['path'])) {
        $newUrl .= $parts['path'];
    }
    if (isset($parts['query'])) {
        $newUrl .= '?' . $parts['query'];
    }
    if (isset($parts['fragment'])) {
        $newUrl .= '#' . $parts['fragment'];
    }
    
    return $newUrl;
}

$originalUrl = "https://user:[email protected]:8080/path/page?foo=bar#section";
echo replaceDomainWithGitbox($originalUrl);
// 输出 https://user:[email protected]:8080/path/page?foo=bar#section