最近遇到一个问题,搞了一段时间了还是没明白,希望这里的大大能帮忙解决一下,谢谢~!
描述如下:
原因是手动配置一个服务器地址,可以手动输入或从别处复制这个地址,然后保存到配置文件中,最重要的是:手动输入的时候,如果输入的是一个不合法的地址,比如我输入百度的地址时把他的点号漏了一个(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#,其他语言也可以。
谢谢~

解决方案 »

  1.   

    按Joke_C原文的说法
    提出我的想法首先是合法URL问题  理论上http://wwwbaidu.com或http://www.baiducom都是合法的URL,但实际上它们都不是用户想访问的网站http://www.baidu.com按我的理解,你是想判断  手动配置一个服务器地址时候就是客户理想中的地址
    这样和URl是否合法没关系我建议 配置一个服务器地址 的时候,或许可以直接访问一下该地址,然后由用户确认是否他们所需要的地址这个应该是比较符合实际的想法了
      

  2.   

    当然要使用正则
    ^http(s)?:\/\/([\w-]+\.)+[\w-]+$
      

  3.   


    /// <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(strRegex);
    if (re.IsMatch(strValue))
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    return false;
    }
      

  4.   

    事实上,这个要检测的服务端地址应该是可以从其他四方复制过来的,所以直接访问以下然后复制过去确实似乎是可取的方式,但是难道还要开一个浏览器来测试一下?或者说我手动输入的时候还要在浏览器上先测试一下,这个有点麻烦的。
    在这个我整的是用WinForm的输入框的文本被改变事件来检测的,所以【可以直接访问一下该地址,然后由用户确认是否他们所需要的地址】似乎不是我的本意。
    当然,好像有一个webbrowser控件吧,这一点好像是可以做到的哦。
    先谢过 slmintg ,等待更多解决方案。
      

  5.   


    这个正则只能匹配形似http://192.168.20.8这样的字符串,后面加一个单词就不行了,比如http://192.168.20.8/abc,同时一个问题也出来了,可能就是 slmintg 说的,就是http://192.168208也会被视为合法的url,直到点号没有的时候才说不是,这个..好像也不行..
      

  6.   


    这个..嗯,其实也不行,我使用http://www.baidu.com/s?tn=baiduhome_pg、http:/www.baidu.com/s?tn=baiduhome_pg、http/www.baidu.com/s?tn=baiduhome_pg、http://www.baidu.com全部被视为有效,直到点号删除到没有了才提示无效..
    尴尬,是不是我没有表述清楚我的需求呢?
      

  7.   


    /// <summary>
            /// 是否为Uri
            /// </summary>
            /// <param name="s">判断字符串</param>
            /// <returns></returns>
            public static bool IsUri(string s)
            {
                Uri u;
                return Uri.TryCreate(s, UriKind.RelativeOrAbsolute,out u);
            }