大漠落日

while(!dead) study++;
posts - 46, comments - 126, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

判断URL是否合法C++代码

Posted on 2010-01-08 19:05 乱78糟 阅读(6333) 评论(3)  编辑 收藏 引用 所属分类: C语言派系
首先声明四点:
  • 本代码是我在MFC中写的,用到了很多MFC种的类,如果要移植到其他开发环境,请自行修改。
  • 因为实际具体要求,所有很多地方可能与大家使用的不同,原理代码贴出来,修改就简单了^_^。
  • 本代码仅仅是一个弱检查,如果有大牛写出了C/C++的正则式判断代码,请一定要给我邮一份,感激涕零。
  • 转载请注明出处,也就是本随笔地址啦。

原理:

URL是否合法的依据是RFC2369,可以点击这里查看RFC2369

本段代码的原理很简单,举一个URL为例:http://xxx.xxx.xx/ffd?=dd22,如何判断是否合法?
如果你用过MFC中AfxParseUrl这个函数,我相信你马上就能明白90%,剩下的10%我后面再讲,首先看下这个函数原型。

BOOL AFXAPI AfxParseURL(
   LPCTSTR pstrURL,
//待解析的URL,http://xxx.xxx.xx/ffd?=dd22
   DWORD& dwServiceType,//解析出来的服务类型,例如http,ftp之类的,上面例子出来为1(AFX_INET_SERVICE_HTTP)
   CString& strServer,//上面例子中的xxx.xxx.xx
   CString& strObject,//上面例子中的/ffd?=dd22
   INTERNET_PORT& nPort//端口
);

这个函数解析成功返回true,否则false。当然,即便它返回true也不代表这个URL就是合法的,为什么呢?看这个例子:http://xxx/dd.html。所以重点变成了判断strServer这个参数是否合法,也就是我上面所说的10%了。

服务器域名有很多子域名,例如asd.page1.cppblog.com、ddd.sina.com.cn。弃繁从简,倒过来,如果找到多个.分开的字段,并且最后一个域名是正确的,就是正确的URL格式。有个例外,那就是纯IP,例如http://192.168.3.124/index.html。
OK,原理完了,上代码。

代码:

//校验URL是否合法文件路径,依据为rfc2396
//这个函数只做粗略的校验,不完全符合RFC2369
//仅支持IPV4
BOOL CAddDlg::CheckURL(const CString &szUrl, CString &szMsg)
{
    DWORD dwService 
= 0;
    DWORD dwValid 
= AFX_INET_SERVICE_FTP|AFX_INET_SERVICE_HTTP|AFX_INET_SERVICE_HTTPS|AFX_INET_SERVICE_FILE;
    CString strServer;  
    CString strObject;  
    INTERNET_PORT port; 

    BOOL bValid 
= AfxParseURL(szUrl, dwService, strServer, strObject, port);  
    
if ( !bValid || strObject.IsEmpty() || strObject == "/" || strServer == "localhost"
        )
    { 
        szMsg 
= szUrl + " \n不是一个合法的下载地址URL";
        
return FALSE;  
    }
    
else//开始检验解析出来的部分
    {
        
if ( (dwService & dwValid) == 0 )
        {
            szMsg 
=  szUrl + "\n不支持的服务类型,目前仅支持http,https,ftp,file";
            
return FALSE;
        }
        
if ( (dwService & AFX_INET_SERVICE_FILE) != 0 )//file协议直接返回TRUE
        {
            
return TRUE;
        }

        CStringArray arr;
        CString dom;
        
int i, size = 0;
    
        ExtractString(arr, strServer, 
".");
        size 
= arr.GetCount();
        
if ( size == 0 )
            
return TRUE;
        dom 
= arr.GetAt( size-1 );

        
for ( i = 0; i < size; i++)
        {
            
if ( IsGb2312(arr.GetAt(i)) )
            {
                szMsg 
= szUrl + " \n不支持包含中文的域名";
                
return FALSE;
            }
        }

        
//先看下是不是192.168.3.2这种IP形式的地址
        if ( IsNumber(dom) )
        {
            
bool bt = true;
            
if ( size == 4 )
            {
                
for ( i = 0; i < size; i++ )
                {
                    UINT32 num 
= CString2UINT32(dom);
                    
if (num < 0 && num > 255)
                    {
                        bt 
= false;
                        
continue;
                    }
                }
                
if ( bt )
                    
return TRUE;
            }
        }
        
else if (size > 1)//查一下域名表
        {
            
for (i = 0; i < DOMAIN_NUM; i++)
            {
                
if (dom == szDomainTable[i])
                    
return TRUE;
            }
        }
        szMsg 
= szUrl + " \n不是一个合法的下载地址URL";
        
return FALSE;
    }
    
return TRUE;
}

上面代码中用到的几个函数如ExtractString、IsGb2312都很简单,为不增加代码长度影响阅读,故不再贴出。
szDomainTable是我定义的一个域名数组,可以点击这里下载domain.h

PS:

本来想找个现成的,可网上搜了好长时间,无果。后来一大牛给我发了个JAVA的正则式判断代码,,不懂JAVA的c++er飘过~~~~~

Feedback

# re: 判断URL是否合法C++代码[未登录]  回复  更多评论   

2010-01-09 18:56 by C++
招聘:C++程序员

职位描述:

1、技术人员职位,在上级的领导和监督下定期完成量化的工作要求;
2、参与公司软件项目平台程序的设计和开发
3、根据开发进度和任务分配,完成平台相应模块的设计、开发、编程任务;
4、进行程序单元、功能的测试,查出软件存在的缺陷并保证其质量;

要求:

1、熟悉Windows C++/MFC编程;
2、熟悉一种大型关系型数据库如Sql Server或Oracle的应用。
3、掌握TCP/IP、多线程开发等;
4、遵守职业道德,严守工作纪律,勤于钻研,勇于进取,具有良好的团队合作精神;
5、两年以上软件开发经验;
熟悉休闲、棋牌类游戏开发经验者优先。
6、注意:待遇是根据能力浮动面议详谈。

应届毕业生或无相关经验者,请勿扰,谢谢!

工作地点:广东湛江

备注:为了提高您的面试机会,请不要直接在网上应聘,请把简历发送至linhang518@163.com,谢谢!

# re: 判断URL是否合法C++代码  回复  更多评论   

2010-04-28 16:23 by Bronco
感觉用正则会更简单方便一点~~

# re: 判断URL是否合法C++代码  回复  更多评论   

2010-10-26 14:09 by http://www.cppblog.com/cyin8/
好东西,支持。

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理