确定是否为绝对或相对URL

时间:2010-10-23 05:46:24

标签: c# parsing url

我在字符串中有一个相对或绝对的url。我首先需要知道它是绝对的还是相对的。我该怎么做呢?然后,我想确定网址的域是否在允许列表中。

以下是我的允许列表,例如:

string[] Allowed =
{
   "google.com",
   "yahoo.com",
   "espn.com"
}

一旦我知道它的相对或绝对,我认为它相当简单:

if (Url.IsAbsolute)
{
    if (!Url.Contains("://"))
        Url = "http://" + Url;

    return Allowed.Contains(new Uri(Url).Host);
}
else //Is Relative
{
    return true;
}

3 个答案:

答案 0 :(得分:95)

bool IsAbsoluteUrl(string url)
{
    Uri result;
    return Uri.TryCreate(url, UriKind.Absolute, out result);
}

答案 1 :(得分:24)

出于某种原因,他们的主人删除了几个好的答案:

通过@Chamika Sandamal

Uri.IsWellFormedUriString(url, UriKind.Absolute)

Uri.IsWellFormedUriString(url, UriKind.Relative)

UriParser和实施@Marcelo Cantos

答案 2 :(得分:3)

您可以使用UriBuilder更直接地实现您想要的,它可以处理相对URI和绝对URI(参见下面的示例)。

@icktoofay也很重要:确保在您允许的列表中包含子域(如www.google.com)或在builder.Host属性上执行更多处理以获取实际域。如果您决定进行更多处理,请不要忘记具有复杂TLD的网址,例如bbc.co.uk

using System;
using System.Linq;
using System.Diagnostics;

namespace UriTest
{
    class Program
    {
        static bool IsAllowed(string uri, string[] allowedHosts)
        {
            UriBuilder builder = new UriBuilder(uri);
            return allowedHosts.Contains(builder.Host, StringComparer.OrdinalIgnoreCase);
        }

        static void Main(string[] args)
        {
            string[] allowedHosts =
            {
                "google.com",
                "yahoo.com",
                "espn.com"
            };

            // All true
            Debug.Assert(
                IsAllowed("google.com", allowedHosts) &&
                IsAllowed("google.com/bar", allowedHosts) &&
                IsAllowed("http://google.com/", allowedHosts) &&
                IsAllowed("http://google.com/foo/bar", allowedHosts) &&
                IsAllowed("http://google.com/foo/page.html?bar=baz", allowedHosts)
            );

            // All false
            Debug.Assert(
                !IsAllowed("foo.com", allowedHosts) &&
                !IsAllowed("foo.com/bar", allowedHosts) &&
                !IsAllowed("http://foo.com/", allowedHosts) &&
                !IsAllowed("http://foo.com/foo/bar", allowedHosts) &&
                !IsAllowed("http://foo.com/foo/page.html?bar=baz", allowedHosts)
            );
        }
    }
}