正则表达式从html获取所有主机

时间:2013-07-11 16:20:04

标签: c# regex

我正在尝试将所有网址都放在一个正则表达式中,目前我正在使用此模式。

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/  

然而,正则表达式返回页面/文件,而不是主机。因此,我不希望运行第二个正则表达式,而是希望有人可以提供帮助

这会返回http://www.yoursite.com/index.html

我正在尝试返回yoursite.com

此外,正则表达式将从html进行解析,之后将检查主机,因此100%的准确性并不重要。

2 个答案:

答案 0 :(得分:2)

假设你的正则表达式:

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/

实际上解析了Urls(我还没有检查过),您可以轻松使用捕获组来获取主机:

/^(https?:\/\/)?(?<host>([\da-z\.-]+)\.([a-z\.]{2,6}))([\/\w \.-]*)*\/?$/

获得Match结果后,您可以检查Groups["host"]以获取主机名。

但是在我看来,只是使用Uri.TryCreate,你会好得多,尽管你需要一点逻辑来解决可能缺乏方案的问题。那就是:

if (!Regex.IsMatch(line, "https?:\/\/"))
    line = "http://" + line;
Uri uri;
if (Uri.TryCreate(line, UriKind.Absolute, out uri))
{
    // it's a valid url.
    host = uri.Host;
}

解析网址是一件非常棘手的事情。例如,没有单个虚线段可以超过63个字符,并且没有什么可以阻止最后一个虚线段具有数字或连字符。也不限于6个字符。您最好将整个字符串传递给Uri.TryCreate,而不是尝试使用单个正则表达式复制URL解析的疯狂。

Url的其余部分(主机名之后)可能是垃圾。如果您想消除导致问题的那一位,那么将所有内容提取到主机名的末尾:

^https?:\/\/[^\/]*

然后通过Uri.TryCreate运行。

答案 1 :(得分:0)

要从示例文本yoursite.com中仅捕获http://www.yoursite.com/index?querystring=value,您可以使用此表达式,但这不会验证字符串:

^(https?:\/\/)?(?:[^.\/?]*[.])?([^.\/?]*[.][^.\/?]*)

enter image description here

现场演示:http://www.rubular.com/r/UNR7qiQ0Eq