我有一个从各种网络资源中提取网址的功能。不用说,有些是完整有效的URL,有些是相对于页面的HTML。下面是我的asp.net / c#logic我派生用于检查URL,然后从网站上抽取的数据生成一个完整的可用URL ...
我有一段时间没有看过这段代码,但我记得它在几个月前运行良好,现在需要进行许多调整才能运行 - 特别是相对路径和从各种相对变化中重新生成一个完整的URL。
有没有比我在这里看到的路由样板任务更简单的方法或方法?
注意: origianlurl是第一个搜索页面的完整网址,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 :(得分:1)
Uri
类有一个constructor,你可以准确地使用它。给定一个基础uri,即你的originatingUrl
和一个字符串(相对部分),它会生成完整的url。据我所知,你的方法中没有一件事是使用Uri
类(可能是几个实例)无法完成的。我的猜测是你可以把它重写为5-10 LOC。