我正在尝试从C#中的字符串中提取域名。您不一定要使用RegEx,但我们应该能够从以下所有内容中提取yourdomain.com
:
yourdomain.com
www.yourdomain.com
http://www.yourdomain.com
http://www.yourdomain.com/
store.yourdomain.com
http://store.yourdomain.com
whatever.youdomain.com
*.yourdomain.com
此外,任何TLD都可以接受,因此请使用.net
,.org
,'co'uk
等替换上述所有内容。
答案 0 :(得分:15)
如果没有方案存在(字符串中没有冒号),请在“http://”前面加上一个有效的网址。
将字符串传递给Uri constructor。
访问Uri的Host property。
现在你有了主机名。你究竟认为给定主机名的“域名”究竟是一个值得商榷的问题。我猜你不是仅仅意味着第一个点之后的一切。
不可能将'whatever.youdomain.com'等主机名与像'warwick.ac.uk'这样的SLD中的域名区别开来。事实上,考虑到一些注册商努力开辟自己的利基市场,甚至有一些关于什么是公共SLD的灰色区域。
一种常见的方法是维护一个由无关实体使用的SLD和其他后缀的大列表。这就是Web浏览器为阻止不必要的公共cookie共享所做的事情。一旦找到了公共后缀,就可以在主机名中添加一个最接近的前缀,用点分割,以获得负责给定主机名的最高级实体,如果这是您想要的。后缀列表是难以维护的,但你可以捎带someone else's efforts。
或者,如果您的应用程序具有时间和网络连接,则可以开始嗅探有关主机名的信息。例如。它可以对主机名进行whois查询,并继续查看每个父项,直到得到结果,这将是负责给定主机名的最低级实体的域名。
或者,如果所有这些工作太多,你可以尝试切断任何领先的'www。'礼物!
答案 1 :(得分:0)
我建议你自己尝试一下。使用调节器和正则表达式备忘单。
http://sourceforge.net/projects/regulator/
http://regexlib.com/CheatSheet.aspx
还可以在coding horror找到关于正则表达式的一些好消息。
答案 2 :(得分:0)
正则表达式并不真正符合您对“任何 TLD”的要求,因为TLD的格式和数量非常大且不断变化。如果您将范围限制为:
(?<domain>[^\.]+\.([A-Z]+$|co\.[A-Z]$))
你会抓住.anything和.co.anything,我想这涵盖了最现实的案例......
答案 3 :(得分:0)
看看这个other answer。它适用于PHP,但您可以轻松地从4-5行PHP中获取正则表达式,您可以从后面的讨论中受益(请参阅Alnitak's answer)。