如何检查字符串是否为有效的HTTP URL?


Answers:


451

尝试执行以下操作来验证HTTP URL(uriName您要测试的URI):

Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) 
    && uriResult.Scheme == Uri.UriSchemeHttp;

或者,如果您想同时接受HTTP和HTTPS URL(根据J0e3gan的评论):

Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) 
    && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);

6
应该读取uriResult.Scheme而不是uriName.Scheme吗?我正在对TryCreate使用重载,该重载使用String而不是Uri作为它的第一个参数。

7
您可能想向uriResult.Scheme == ...添加更多条件...特别是https。这取决于您需要什么,但是对于我来说,这个小小的改变就是我需要的,它可以完美地工作。
Fiarr 2014年

11
为了清楚@Fiarr的评论,除HTTP URL外,还需要考虑HTTPS的“小变化”是:bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps;
J0e3gan 2014年

3
对于abcde这样的URL,这种方式将失败。它说这是一个有效的URL。
Kailash P

7
看来这项技术未能通过75项测试中的22项dotnetfiddle.net/XduN3A
whitneyland

98

此方法在http和https中都可以正常工作。仅一行:)

if (Uri.IsWellFormedUriString("https://www.google.com", UriKind.Absolute))

MSDN:IsWellFormedUriString


13
对于非HTTP URI(即任何其他方案,例如file://或),这将返回true ldap://。此解决方案应与对该方案进行检查相结合-例如if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
Squiggle

该RFC3986兼容吗?
Marcus

3
@Squiggle这就是我想要它来检查到底是什么,一切都因为我正在做一个下载器。所以,这个答案对我来说是最好的方法。
Beyondo

24
    public static bool CheckURLValid(this string source)
    {
        Uri uriResult;
        return Uri.TryCreate(source, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
    }

用法:

string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
  //valid process
}

更新:(单行代码)谢谢@GoClimbColorado

public static bool CheckURLValid(this string source) => Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps;

用法:

string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
  //valid process
}

这似乎无法处理www网址。IE:www.google.com显示为无效。
Zauber Paracelsus '02

6
@ZauberParacelsus“ www.google.com”无效。: “// www.google.com HTTP”没有空间URL平均应以“http”, “FTP”, “程序文件”等字符串开头应该是
ErçinDedeoğlu

1
今天,out参数可以改善Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
GoClimbColorado

11

这里所有的答案,或者允许与其他方案的网址(例如file://ftp://)或拒绝人类可读的网址不启动http://https://(例如www.google.com与用户输入打交道时,这是不好的

这是我的方法:

public static bool ValidHttpURL(string s, out Uri resultURI)
{
    if (!Regex.IsMatch(s, @"^https?:\/\/", RegexOptions.IgnoreCase))
        s = "http://" + s;

    if (Uri.TryCreate(s, UriKind.Absolute, out resultURI))
        return (resultURI.Scheme == Uri.UriSchemeHttp || 
                resultURI.Scheme == Uri.UriSchemeHttps);

    return false;
}

用法:

string[] inputs = new[] {
                          "https://www.google.com",
                          "http://www.google.com",
                          "www.google.com",
                          "google.com",
                          "javascript:alert('Hack me!')"
                        };
foreach (string s in inputs)
{
    Uri uriResult;
    bool result = ValidHttpURL(s, out uriResult);
    Console.WriteLine(result + "\t" + uriResult?.AbsoluteUri);
}

输出:

True    https://www.google.com/
True    http://www.google.com/
True    http://www.google.com/
True    http://google.com/
False

1
这可以通过“ mooooooooo”之类的单个单词来完成,但可以与Uri.IsWellFormedUriString一起使用
Epirocks

@Epirocks很好。问题在于,http://mooooooooo实际上是一个有效的Uri。因此,Uri.IsWellFormedUriString在插入“ http://”之后便无法检查,如果之前进行过检查,则没有的任何内容Scheme都会被拒绝。也许可以做的是s.Contains('.')代替我们检查。
艾哈迈德·阿卜杜勒·哈密德19'Mar

moooooo本身看起来不像url,因为它没有协议。我所做的就是拿出您的正则表达式匹配调用,并使用IsWellFormedUriString进行&&匹配。
Epirocks

@Epirocks正是!问题是,如果您IsWellFormedUriString在添加之前使用,则http://最终会拒绝类似之类的东西google.com;如果在添加之后使用它http://,则它仍然会为true http://mooooooooo。这就是为什么我建议检查字符串是否包含a的原因.
艾哈迈德·阿卜杜勒·哈默德

无论如何,这对我来说很好,我不想接受没有http或https的网址。因此,我首先使用IsWellFormedUriString,然后使用不带正则表达式的函数。bool bResult =(Uri.IsWellFormedUriString(s,UriKind.Absolute)&& ValidHttpURL(s,uriResult))); 谢谢
Epirocks


3

试试看:

bool IsValidURL(string URL)
{
    string Pattern = @"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$";
    Regex Rgx = new Regex(Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
    return Rgx.IsMatch(URL);
}

它将接受如下URL:

  • http(s)://www.example.com
  • http(s)://stackoverflow.example.com
  • http(s)://www.example.com/page
  • http(s)://www.example.com/page?id = 1&product = 2
  • http(s)://www.example.com/page#start
  • http(s)://www.example.com:8080
  • http(s)://127.0.0.1
  • 127.0.0.1
  • www.example.com
  • example.com

2

这将返回布尔:

Uri.IsWellFormedUriString(a.GetAttribute("href"), UriKind.Absolute)

2
我认为OP特别提到了他,他不喜欢Uri.IsWellFormedUriString,因为它为文件路径提供了正确的支持。您对此问题有解决方案吗?
Isantipov 2014年

1
Uri uri = null;
if (!Uri.TryCreate(url, UriKind.Absolute, out uri) || null == uri)
    return false;
else
    return true;

url是您必须测试的字符串。


3
null == url检查非常多余
JSON,

0
bool passed = Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)

您的回答来自质量较低的帖子。即使您的代码是自我解释的,也请提供一些解释。
Harsha Biyani
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.