为了正确计算子域,诀窍是您需要知道倒数第二个期间。然后,通过从域的总长度中减去第二个句点(或 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))
}