29

我希望在这种情况下使用 PowerShell 去除域。从以下变量中获取“domain.com”的最有效方法是什么?

$URL = "http://www.domain.com/folder/"

(这里的某种正则表达式命令使用 PowerShell 将 $URL 转换/剥离为 $DOMAIN)

$DOMAIN = "domain.com" #<-- taken from $URL

我已经搜索并找到了从域中查找 IP 地址的结果,但我需要首先使用正则表达式(或其他方法)确定域是什么。任何建议都很棒。

4

3 回答 3

71

试试 Uri 类:

PS> [System.Uri]"http://www.domain.com/folder/"


AbsolutePath   : /folder/
AbsoluteUri    : http://www.domain.com/folder/
LocalPath      : /folder/
Authority      : www.domain.com
HostNameType   : Dns
IsDefaultPort  : True
IsFile         : False
IsLoopback     : False
PathAndQuery   : /folder/
Segments       : {/, folder/}
IsUnc          : False
Host           : www.domain.com
Port           : 80
Query          :
Fragment       :
Scheme         : http
OriginalString : http://www.domain.com/folder/
DnsSafeHost    : www.domain.com
IsAbsoluteUri  : True
UserEscaped    : False
UserInfo       :

并删除 www 前缀:

PS> ([System.Uri]"http://www.domain.com/folder/").Host -replace '^www\.'
domain.com
于 2013-01-16T16:47:22.113 回答
3

像这样:

PS C:\ps> [uri]$URL = "http://www.domain.com/folder/"
PS C:\ps> $domain = $url.Authority -replace '^www\.'
PS C:\ps> $domain
domain.com
于 2013-01-16T16:49:04.860 回答
1

为了正确计算子域,诀窍是您需要知道倒数第二个期间。然后,通过从域的总长度中减去第二个句点(或 0)的位置,将倒数第二个句点的子字符串(如果只有一个 .,则没有子串)带到最终位置。这将仅返回正确的域,并且无论 TLD 下嵌套了多少子域都将起作用:

$domain.substring((($domain.substring(0,$domain.lastindexof("."))).lastindexof(".")+1),$domain.length-(($domain.substring(0, $domain.lastindexof("."))).lastindexof(".")+1))

另请注意,系统 URI 本身在 99% 的情况下都是有效的,但我正在解析我的 IIS 日志并发现对于非常长(通常是无效/恶意请求)的 URI,它无法正确解析并失败。

我有这个功能形式:

Function Get-DomainFromURL {
    <#
    .SYNOPSIS
    Takes string URL and returns domain only
    .DESCRIPTION
    Takes string URL and returns domain only
    .PARAMETER URL
    URL to parse for domain
    .NOTES
    Author: Dane Kantner 9/16/2016

    #>


    [CmdletBinding()]
        param(
        [Alias("URI")][parameter(Mandatory=$True,ValueFromPipeline=$True)][string] $URL
    )

    try { $URL=([System.URI]$URL).host }
    catch { write-error "Error parsing URL"}
    return $URL.substring((($URL.substring(0,$URL.lastindexof("."))).lastindexof(".")+1),$URL.length-(($URL.substring(0,$URL.lastindexof("."))).lastindexof(".")+1))
}
于 2016-09-16T20:38:12.857 回答