日期:2014-05-17  浏览次数:21072 次

C#如何检测一个字符串是不是合法的URL
最近遇到一个问题,搞了一段时间了还是没明白,希望这里的大大能帮忙解决一下,谢谢~!
描述如下:
原因是手动配置一个服务器地址,可以手动输入或从别处复制这个地址,然后保存到配置文件中,最重要的是:手动输入的时候,如果输入的是一个不合法的地址,比如我输入百度的地址时把他的点号漏了一个(http://wwwbaidu.com或http://www.baiducom),
这种情况能不能算合法的地址?
或者说合法的URL可不可以这样的?
如果不算,那么我怎么控制这个输入?

目前试过如下几个方式:
1.使用正则表达式,但是我自己其实不懂正则,所以都是网上的,好几个都试过了,不行,其中试过的正则有:
    "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?"
    "(([a-zA-Z][0-9a-zA-Z+\\-\\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?"
    "/^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i"
    "(https?|ftp|mms):\/\/([A-z0-9]+[_\-]?[A-z0-9]+\.)*[A-z0-9]+\-?[A-z0-9]+\.[A-z]{2,}(\/.*)*\/?"
2.使用Uri的静态方法IsWellFormedUriString(C#的),也不行,他直接都把http//wwwbaiducom当做合法的地址了;
3.使用Uri的实例方法IsWellFormedOriginalString(C#的),当然这个似乎行,但其实是不行的,说它行是指在实例化一个Uri对象的时候(Uri uri = new Uri(sUrl);)如果参数不是合法的地址那就会异常,也就是说差不多就算检测出来了,但是那就没有用到这个IsWellFormedOriginalString方法了,而且实例化之后的这个uri对象没有使用就废掉了;

一时半会我还真是不知道该怎么处理了,不知道还有什么办法没,请大家帮忙提供个解决方按或解决思路。具体的实现语言的话,暂时倒不一定要限制为C#,其他语言也可以。
谢谢~

------解决方案--------------------
按Joke_C原文的说法
提出我的想法

首先是合法URL问题  理论上http://wwwbaidu.com或http://www.baiducom都是合法的URL,但实际上它们都不是用户想访问的网站http://www.baidu.com

按我的理解,你是想判断  手动配置一个服务器地址时候就是客户理想中的地址
这样和URl是否合法没关系

我建议 配置一个服务器地址 的时候,或许可以直接访问一下该地址,然后由用户确认是否他们所需要的地址

这个应该是比较符合实际的想法了
------解决方案--------------------
当然要使用正则
^http(s)?:\/\/([\w-]+\.)+[\w-]+$
------解决方案--------------------

/// <summary>
        /// 检测串值是否为合法的网址格式
        /// </summary>
        /// <param name="strValue">要检测的String值</param>
        /// <returns>成功返回true 失败返回false</returns>
        public static bool CheckIsUrlFormat(string strValue)
        {
            return Utility.CheckIsFormat(@"(http://)?([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?", strValue);
        }

/// <summary>
        /// 检测串值是否为合法的格式
        /// </summary>
        /// <param name="strRegex">正则表达式</param>
        /// <param name="strValue">要检测的String值</param>
        /// <returns>成功返回true 失败返回false</returns>
public static bool CheckIsFormat(string strRegex,string strValue)
{
if(strValue != null && strValue.Trim() != "")
{
Regex re = new Regex(strRege