2012-05-24 115 views
5

客户可以从域名输入网站。他们也可以从他们的联系人进入女王。解析域名/主机名字符串

知道我们需要找到哪些websited whoose域可以关联到mailadresses的域的客户。

所以我的想法是从webadress并从URL中提取的主机,并比较他们

那么什么是最可靠的算法得到从URL的主机名?

例如主机可以是:

foo.com 
www.foo.com 
http://foo.com 
https://foo.com 
https://www.foo.com 

结果应始终foo.com

+0

没错,我的错误 –

+0

澄清一点的,因为你与.vu TLD删除的例子,你说你只关心.COM顶级域名或者这是一个过于简单化? –

+0

这简直太简单了。它可以是任何类型的顶级域名,.de .eu .biz ..... 重要的要求是通过查看网站的URL找到可能的候选人匹配mailadresses –

回答

10

而不是依靠不可靠的正则表达式使用System.Uri做解析为您服务。使用这样的代码:

string uriStr = "www.foo.com"; 
if (!uriStr.Contains(Uri.SchemeDelimiter)) { 
    uriStr = string.Concat(Uri.UriSchemeHttp, Uri.SchemeDelimiter, uriStr); 
} 
Uri uri = new Uri(uriStr); 
string domain = uri.Host; // will return www.foo.com 

我们得到公正的顶级域名,你可以使用:

string tld = uri.GetLeftPart(UriPartial.Authority); // will return foo.com 
+1

不应该导致只是“com”? – mikesjawnbit

+2

@anubhava:uri.GetLeftPart(UriPartial.Authority)不返回根域名。相反,它会返回URL的整个左侧部分,从方案开始到端口结束(如果指定)。 AFAIK,忽略主机的子域部分的唯一方法是使用2-pass调用将其明确截断为string.LastIndexOf()。 –

+0

请更新answer.string tld不返回根目录。 – LikePod

1

这里有一个正则表达式匹配的URL的您提供。基本上http和https等是可选的,就像www一样,然后匹配到一个可能的路径;

var expression = /(https?:\/\/)?(www\.)?([^\/]*)(\/.*)?$/; 

这将意味着;

var result = 'https://www.foo.com.vu/blah'.replace(expression, '$3') 

将评估为

result === 'foo.com.vu' 
+0

问题是关于子域的问题。我认为他们不应该被包括在结果中。所以product.mycompany.com应该最终在mycompany.com –

+1

这可能是相当困难的,因为你无法数点点子域名(我想我想说的是像.co.uk会搞砸了)。您可能必须执行两次检查,一次使用上面的表达式,另一次使用第一个点之前的char字符串 – cmilhench

+0

如果您使用无效字符(例如'a!notit.com')评估DNS名称,则此答案将失败。 ,或者字符太多(超过63个)的 –