2013-07-11 22 views
0

我试图在一个正则表达式中获取所有的URL,目前我正在使用这种模式。正则表达式从html中获取所有主机

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

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

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

我试图返回yoursite.com

此外,正则表达式将从HTML解析和主机将被检查后,所以100%的准确性并不重要。

+0

我欣赏你的努力,但你为什么不使用已经在.NET中提供的解决方案?http://msdn.microsoft.com/en-us/library/system.uri.aspx – matcheek

+3

您是否想向我们展示至少一个源文本样本,然后展示您期望的内容以及您获得的内容?它使得它更容易理解... – Chris

+0

这种模式不会返回任何结果,您能否告诉我们一个真正的尝试 –

回答

2

假设你的正则表达式:

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

实际上并解析URL(我没有检查它),你可以很容易地使用捕获组获取主机:

/^(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

0

捕捉刚刚从样本文本http://www.yoursite.com/index?querystring=valueyoursite.com,你可以用这句话,但是这并不验证字符串:

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

enter image description here

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