Code: UrlBuilder class in JavaScript

 /***********************************************************
 UrlBuilder Class created by JavaScript

 Author: lizhi[at]hit.edu.cn
 Version: 1.0
 Created: 2006.02.21 22:05
 Updated: N/A

 History:
     1. The first version of code created in 2006.02.21 
***********************************************************/

function UrlBuilder(url)
{
    
this.m_Href = null;
    
this.m_Host = null;
    
this.m_Hostname = null
    
this.m_Port = null;
    
this.m_Protocol = null;
    
this.m_Path = null;
    
this.m_Search = null;
    
this.m_Hash = null;
    
this.m_Params = null
    this.m_Sucess = false
    if ( url )
this.Parse(url);
   
    
this.toString = function()
    
{
         
return '[class UrlBuilder]';
    }
;     
}


UrlBuilder.prototype.Parse 
= function(url)
{
    
var m = url.match(/(\w{3,5}:)\/\/([^\.]+(?:\.[^\.:/]+)+)(?::(\d{1,5}))?\/?/);
    
if ( m )
    
{
         
this.m_Protocol = m[1];
         
this.m_Hostname = m[2]; 
         
this.m_Port = m[3]; 
         
if ( this.m_Port ) 
         
{
             
this.m_Host = this.m_Hostname + ':' + this.m_Port;
         }

         
else
         
{  
             
this.m_Host = m[2];
         }

         
var indexHash = url.indexOf('#');
         
if ( indexHash != -1 )
         
{
             
this.m_Hash = url.substr(indexHash);
         }

         
else
         
{
             
this.m_Hash = '';
         }
        
         
var indexParams = url.indexOf('?');
         
if ( indexParams != -1 )
         
{
             
if ( indexHash != -1 )
             
{
                  
this.m_Search = url.substring(indexParams, indexHash);
             }

             
else
             

                  
this.m_Search = url.substr(indexParams);
             }

             
this.m_Path = url.substr(indexParams);
         }

         
else
         
{
             
this.m_Search = '';
         }

         this.m_Success = true
         this.m_Params = null
        
this.m_Href = url;
    }

}
;

UrlBuilder.prototype.GetValue 
= function(key, encoding)
{
    
if ( !this.m_Params )
    
{
         
if ( this.m_Search )
         
{
             
this.m_Params = {}
             
var search = this.m_Search.substring(1);
             
var keyValues = search.split('&');
             
for ( var i=0 ; i < keyValues.length ; ++i )
             
{
                  
var keyValue = keyValues[i];
                  
var index = keyValue.indexOf('=');
                  
if ( index != -1 )
                  
{
                       
this.m_Params[keyValue.substring(0, index)] = keyValue.substr(index+1);
                  }

                  
else
                  
{
                       
this.m_Params[keyValue] = '';
                  }

              }
  
         }

    }

    encoding 
= encoding || ''; 
    
switch(encoding.toUpperCase())
    
{
         
case 'UTF8' :
         
{
              
return decodeURI(this.m_Params[key]);
         }

         
case 'UNICODE' :
         
{
              
return unescape(this.m_Params[key]);
         }

         
case 'GB2312' : // need VBScript function Chr()
         default :
         
{
              
return this.m_Params[key];
         }

    }
  
}


Test Case:
<script language="javascript">
function TestUrlBuilder()
{
    
var url = new UrlBuilder('http://birdshome.cnblogs.com:8080/index.aspx?hl=zh-CN&newwindow=1&q=#abc');
    url.GetValue(''); 
    
var strParams = ''; 
    
for ( var key in url.m_Params )
    
{
         strParams 
+= key + ' = ' + decodeURI(url.m_Params[key]) + '\r\n';
    }
 
    alert('m_Href\t
=\t' + url.m_Href 
        
+ '\r\nm_Host\t=\t' + url.m_Host
        
+ '\r\nm_Hostname\t=\t' + url.m_Hostname
        
+ '\r\nm_Port\t=\t' + url.m_Port
        
+ '\r\nm_Protocol =\t' + url.m_Protocol
        
+ '\r\nm_Path\t=\t' + url.m_Path
        
+ '\r\nm_Search\t=\t' + url.m_Search
        
+ '\r\nm_Hash\t=\t' + url.m_Hash
        
+ '\r\n\r\n' + strParams);    
}

</script>

Result:
m_Href    =    http://birdshome.cnblogs.com:8080/index.aspx?hl=zh-CN&newwindow=1&q=#abc
m_Host    =    birdshome.cnblogs.com:8080
m_Hostname =    birdshome.cnblogs.com
m_Port    =    8080
m_Protocol =    http:
m_Path    =    ?hl=zh-CN
&newwindow=1&q=#abc
m_Search =    ?hl=zh-CN
&newwindow=1&q=
m_Hash    =    #abc

hl = zh-CN
newwindow = 1
q =

Shortage:
    正则表达式:/(\w{3,5}:)\/\/([^\.]+(?:\.[^\.:/]+)+)(?::(\d{1,5}))?\/?/ 不能处理带有用户名和密码的url,同时也不能处理Int32格式的IP地址(如: http://3396788377/),本来支持也容易,但是这两种url的使用频率实在太少了。

posted on 2006-01-03 00:08  birdshome  阅读(2689)  评论(5编辑  收藏  举报

导航