2010-11-16 73 views
-2

我有一个函数可以从各种网页资源中提取URL。不用说,有些是完全有效的URL,有些是相对于页面的HTML而言的。下面是我的asp.net/c#逻辑我派生用于检查的URL,然后生成一个完全可用的网址从什么拉从网站...用于修复相关网址到完整网址的asp.net逻辑

我有没有看过这段代码在一段时间,但我记得它几个月前运行良好,现在需要很多调整才能运行 - 尤其是在相对路径以及从各种相对变化中重新生成完整网址时。

有没有比我在这里更简单的方法或方法来完成这个看似路由的样板任务?

注: origianlurl是第一个搜索页面的完整URL,并且relativeUrl是搜索页面中发现了一个网址(也可以是一个完整的www.site.com或/contactus.html)

private string ResolveRelativePaths(string relativeUrl, string originatingUrl) 
    { 
     if (relativeUrl.StartsWith("http") || relativeUrl.StartsWith("www")) 
      return relativeUrl; 

     if (relativeUrl.StartsWith("/")) 
     { 
      //get main url something.com 
      Uri myURI = new Uri(originatingUrl); 

      //add the relative page to the end 
      return myURI.Host + relativeUrl; 
     } 

     string resolvedUrl = String.Empty; 

     string[] relativeUrlArray = relativeUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 
     string[] originatingUrlElements = originatingUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 
     int indexOfFirstNonRelativePathElement = 0; 
     for (int i = 0; i <= relativeUrlArray.Length - 1; i++) 
     { 
      if (relativeUrlArray[i] != "..") 
      { 
       indexOfFirstNonRelativePathElement = i; 
       break; 
      } 
     } 

     int countOfOriginatingUrlElementsToUse = originatingUrlElements.Length - indexOfFirstNonRelativePathElement - 1; 
     //for (int i = 0; i <= countOfOriginatingUrlElementsToUse - 1; i++) 
     for (int i = 0; i <= countOfOriginatingUrlElementsToUse ; i++) 
     { 
      if (originatingUrlElements[i] == "http:" || originatingUrlElements[i] == "https:") 
       resolvedUrl += originatingUrlElements[i] + "//"; 
      else 
       resolvedUrl += originatingUrlElements[i] + "/"; 
     } 

     for (int i = 0; i <= relativeUrlArray.Length - 1; i++) 
     { 
      if (i >= indexOfFirstNonRelativePathElement) 
      { 
       resolvedUrl += relativeUrlArray[i]; 

       if (i < relativeUrlArray.Length - 1) 
        resolvedUrl += "/"; 
      } 
     } 

     return resolvedUrl; 
    } 
+0

为什么投下这个问题呢? – kacalapy 2010-11-17 15:43:59

回答

1

Uri类有一个constructor,您可以使用它。给定一个基本URI,这是你的originatingUrl和一个字符串(相对部分),它会生成完整的URL。据我所见,在你的方法中没有一件事情不能使用Uri类(也许是几个例子)完成。我的猜测是你可以将它改写成5-10 LOC。

+0

我使用的uri类,我可以但你永远不知道你会从网上拉下来。因为有这么多的变量,这个自定义代码似乎更适合处理所有的变化。我担心乌里班会抛出左右错误。 – kacalapy 2010-11-16 22:37:29

+1

@ kacalapy:你害怕它会*?你甚至没有尝试自动假设你可以编写比框架中更好的功能。 Uri类有一个'TryCreate'方法,如果失败则返回false。这并不是左右摇晃的错误。我100%相信'Uri'类更健壮,处理比你的代码更多的特殊情况。 – 2010-11-16 22:42:35

+0

我确实尝试过,这就是为什么我用另一种方式去做这个...我在样本的顶部使用了uri calss,可以详细介绍TryCreate的用法,我似乎没有这样做过。也原来的代码是.net 2.0现在我把它全部移植到.net 4.0 – kacalapy 2010-11-16 22:45:28