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的使用频率实在太少了。


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
JavaScript
js开发:请解释什么是ES6的类(class),并说明它与传统构造函数的区别。
ES6的类提供了一种更简洁的面向对象编程方式,对比传统的构造函数,具有更好的可读性和可维护性。类使用`class`定义,`constructor`定义构造方法,`extends`实现继承,并可直接定义静态方法。示例展示了如何创建`Person`类、`Student`子类以及它们的方法调用。
198 2
|
Web App开发 JavaScript 前端开发
JavaScript 类(class)
JavaScript 类(class)
109 2
JavaScript 类(class)
|
JavaScript 前端开发
js之class继承|27
js之class继承|27
|
JavaScript 前端开发
JavaScript进阶-Class与模块化编程
【6月更文挑战第21天】**ES6引入Class和模块化,提升JavaScript的代码组织和复用。Class是原型机制的语法糖,简化面向对象编程。模块化通过`import/export`管理代码,支持默认和命名导出。常见问题包括`this`指向和循环依赖。理解这些问题及避免策略,能助你写出更高效、可维护的代码。**
131 5
|
JavaScript 前端开发 Java
【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析
【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析
153 2
|
存储 JavaScript 前端开发
【JavaScript】JavaScript 中的 Class 类:全面解析
【JavaScript】JavaScript 中的 Class 类:全面解析
637 1
|
前端开发 JavaScript
前端 js 经典:class 类
前端 js 经典:class 类
117 2
|
前端开发 JavaScript
前端 JS 经典:Class 面向对象
前端 JS 经典:Class 面向对象
103 1
|
JavaScript
JS 自测题 —— 手写 class
JS 自测题 —— 手写 class
82 0
|
JavaScript 前端开发
JavaScript编码之路【ES6新特性之Class类】(二)
JavaScript编码之路【ES6新特性之Class类】(二)
81 0