0

我正在尝试在一个正则表达式中获取所有 url,目前我正在使用这种模式。

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

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

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

我正在尝试返回yoursite.com

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

4

2 回答 2

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

于 2013-07-11T18:43:47.703 回答
0

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

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

在此处输入图像描述

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

于 2013-07-11T18:51:36.670 回答