我如何在c#中获得URL的一部分/子域

本文关键字:URL 一部分 子域 | 更新日期: 2023-09-27 18:07:30

我有一个如下的URL

http://yellowcpd.testpace.net

我怎么能得到yellowcpd从这个?我知道我可以用字符串解析做到这一点,但是c#中有内置的方法吗?

我如何在c#中获得URL的一部分/子域

假设您的url始终是testpace.net,请尝试:

var subdomain = Request.Url.Host.Replace("testpace.net", "").TrimEnd('.');

它只会给你主机的非testpace.net部分。如果你没有Request.Url.Host,你可以用new Uri(myString).Host代替。

try this

string url = Request.Url.AbsolutePath;
var myvalues= url.Split('.');

我怎么能从这个得到黄色的cpd ?我知道我可以用字符串来做解析,但是c#中有内置的方法吗?

。Net没有提供从Uri.Host中提取特定部分的内置功能。您必须自己使用字符串操作或正则表达式。

域名字符串中唯一不变的部分是TLD。TLD是域名字符串的最后一位,例如。com,。net,。uk等。下面的所有内容都取决于其位置的特定TLD(所以你不能假设最后一部分的下一个是"域名",因为。co。英国应该是。co

符合要求

分两行:

string rawURL = Request.Url.Host;
string domainName = rawURL .Split(new char[] { '.', '.' })[1];

或大于1:

string rawURL = Request.Url.Host.Split(new char[] { '.', '.' })[1];

你的问题的简单答案是没有一个内置的方法来提取只是子域。话虽如此,这是我使用的解决方案…

public enum GetSubDomainOption
{
    ExcludeWWW,
    IncludeWWW
};
public static class Extentions
{
    public static string GetSubDomain(this Uri uri,
        GetSubDomainOption getSubDomainOption = GetSubDomainOption.IncludeWWW)
    {
        var subdomain = new StringBuilder();
        for (var i = 0; i < uri.Host.Split(new char[]{'.'}).Length - 2; i++)
        {
            //Ignore any www values of ExcludeWWW option is set
            if(getSubDomainOption == GetSubDomainOption.ExcludeWWW && uri.Host.Split(new char[]{'.'})[i].ToLowerInvariant() == "www") continue;
            //I use a ternary operator here...this could easily be converted to an if/else if you are of the ternary operators are evil crowd
            subdomain.Append((i < uri.Host.Split(new char[]{'.'}).Length - 3 && 
                              uri.Host.Split(new char[]{'.'})[i+1].ToLowerInvariant() != "www") ?                     
                                   uri.Host.Split(new char[]{'.'})[i] + "." :
                                   uri.Host.Split(new char[]{'.'})[i]);
        }
        return subdomain.ToString();
    }
}

用法:

var subDomain = Request.Url.GetSubDomain(GetSubDomainOption.ExcludeWWW);

var subDomain = Request.Url.GetSubDomain();

我目前有默认设置包括WWW。您可以通过切换GetSubDomain()方法中的可选参数值来轻松地扭转这一点。

在我看来,这允许一个选项在代码中看起来很好,而无需深入研究似乎是c#的"内置"。只是为了确认你的期望…我测试了三个值,如果使用了排除标志,这个方法将始终只返回"yellowcpd"。

  • www.yellowcpd.testpace.net
  • yellowcpd.testpace.net
  • www.yellowcpd.www.testpace.net
我使用的一个假设是……在.上分割主机名总是会导致最后两个值是域名(例如something.com)

正如其他人指出的那样,您可以这样做:

var req = new HttpRequest(filename: "search", url: "http://www.yellowcpd.testpace.net", queryString: "q=alaska");
var host = req.Url.Host;
var yellow = host.Split('.')[1];

您想要的URL部分是主机名的一部分。您可能希望找到一些直接处理名称部分的方法,例如:"TestSpace中的子域(yellowcpd)",但这可能是不可能的,因为有效主机名的规则允许使用任意数量的标签(请参阅有效主机名)。主机名可以有任意数量的标签,以句号分隔。你必须添加额外的限制来得到你想要的东西。

将主机名分成不同的标签,如果存在则丢弃www,取下一个标签。