Javascript URI/URL Parser and QueryString Parser/Decoder(Javascript 版本URI/URL及QueryString解析器)

一个Javascript版本的URI/URL的解析器,可以解析出URI/URL的scheme, query string, fragment, authority, user-info, path, host和port部分。例如:

   http://user:[email protected]:8080/path/subpath?query=string&myspace=x%20%x#fabc

中http是scheme部分,user:password是userInfo部分,example.com是host部分,8080是port端口,/path/subpath是path部分,query=string&myspace=x%20%x是query string部分,fabc是fragment部分。

可以这样获取各URL的部分:

var url = new URLParser("http://user:[email protected]:8080/path/subpath?query=string&myspace=x%20%x#fabc"); // get host (example.com) var host = url.getHost(); // get querystring (query=string&myspace=x%20%x) var host = url.getQuery();

 

也可以用getParameter和getParameterValues来获取Query String(如name=value&abc=efg&param=value%20bbb)中URL decode后的参数(像Java中HttpRequest里的方法),如:

var url = new URLParser("http://user:[email protected]:8080/path/subpath?query=string&myspace=x%20%x#fabc"); // get all parameter names (query,myspace) var names = url.getParameterNames(); // get url decoded value of 'query' var value = url.getParameter("query"); // get all values of 'query' var values = url.getParameterValues("query"); // use values[0], values[1]... get value

另外,还包含一个直接解析QueryString的解析器:var q = new QueryStringParser("a=b&c=d%20d&e=f");  q.getParameter("c"); 获取值"c d".

 

以下是含URI/URL及查询串(querystring)解析器的Javascript代码:

<script type="text/javascript"> // URI/URL Parser and QueryString Parser for Javascript. // You can get scheme, query string, fragment, authority, user-info, path, host and port parts of an URI or URL by this parser. // It looks like java.net.URI for Java. You can also get parameters of querystring by getParameterNames(), getParameter(name), // and getParameterValues(name) methods. // License: Apache License (http://www.apache.org/licenses/LICENSE-2.0) // Author: Huang Qiangxiong ([email protected]) // change log: // 2010-08-21 // Just can play. function URLParser(url) { return new URIParser(url); } function URIParser(uri) { function __blank(str) { return (str == undefined || str == null || str == "") ? null : str; } var scheme = null; var specificPart = null; var hierPart = null; var query = null; var fragment = null; var authority = null; var path = null; var userInfo = null; var host = null; var port = -1; //p1=[scheme:]hier-part[?query][#fragment] ///2=scheme /3=scheme-specific-part(hier-part + query) /4=hier-part /6=query /8=fragment var p1=/^(([a-zA-Z][a-zA-Z0-9/-_+/.]*):)?(([^?#]+)(/?([^#]*))?)(#(.*))?$/; var ret = uri.match(p1); if (ret) { scheme = __blank(ret[2]); specificPart = __blank(ret[3]); hierPart = __blank(ret[4]); query = __blank(ret[6]); fragment = __blank(ret[8]); } else { throw "Not a valid URI [" + uri + "]"; } if (hierPart != null) { //p2=[//authority][path] ///2=authority /3=path var p2=/^(////([^//]*))?(.*)?$/; ret = hierPart.match(p2); if (ret) { authority = __blank(ret[2]); path = __blank(ret[3]); } } if (authority != null) { //p3=[user-info@]host[:port] ///2=userInfo /3=host /5=port var p3=/^(([^@]*)@)?([^:]+)(:([0-9]*))?$/ ret = authority.match(p3); if (ret) { userInfo = __blank(ret[2]); host = __blank(ret[3]); var xport = __blank(ret[5]); if (xport != null) { port = xport; } } } // parsing query string: name=value&name=value&... var queryParser = new QueryStringParser(query); // following access method this.getURI = function () { return uri; } this.getScheme = function() { return scheme; } this.getSpecificPart = function() { return specificPart; } this.getHierPart = function() { return hierPart; } this.getQuery = function() { return query; } this.getFragment = function() { return fragment; } this.getAuthority = function() { return authority; } this.getPath = function() { return path; } this.getFile = function() { return file; } this.getUserInfo = function() { return userInfo; } this.getHost = function() { return host; } this.getPort = function() { return port; } this.getParameterNames = function() { return queryParser.getParameterNames(); } this.getParameterValues = function(name) { return queryParser.getParameterValues(name); } this.getParameter = function(name) { return queryParser.getParameter(name); } } // parsing query string: name=value&name=value&... function QueryStringParser(query) { var params = {}; var paramNames = new Array(); if (query != null && query.length > 0) { var array = query.split("&"); for(i in array){ var kv = array[i].split("="); var name = decodeURIComponent(kv[0]); var value = (kv[1] == undefined) ? "" : decodeURIComponent(kv[1]); if (params[name]) { var arr = params[name]; arr[arr.length] = value; } else { params[name] = new Array(value); paramNames[paramNames.length] = name; } } } this.getQueryString = function() { return query; } this.getParameterNames = function() { return paramNames; } this.getParameterValues = function(name) { return (params[name] == undefined) ? null : params[name]; } this.getParameter = function(name) { return (params[name] == undefined) ? null : params[name][0]; } } </script>

 

可以用以下代码测试一下:

<html> <head> <script type="text/javascript"> ... Put URI/URL Parser javascript here </script> <script type="text/javascript"> // Test Code function testURIParser(uri) { document.write("----------Parsing URI = " + uri + " -----------<br>"); try { //var r = new URIParser(uri); var r = new URLParser(uri); document.write("&nbsp;&nbsp;getURI() = " + r.getURI() + "<br>"); document.write("&nbsp;&nbsp;getScheme() = " + r.getScheme() + "<br>"); document.write("&nbsp;&nbsp;getSpecificPart() = " + r.getSpecificPart() + "<br>"); document.write("&nbsp;&nbsp;getQuery() = " + r.getQuery() + "<br>"); document.write("&nbsp;&nbsp;getFragment() = " + r.getFragment() + "<br>"); document.write("&nbsp;&nbsp;getAuthority() = " + r.getAuthority() + "<br>"); document.write("&nbsp;&nbsp;getPath() = " + r.getPath() + "<br>"); document.write("&nbsp;&nbsp;getUserInfo() = " + r.getUserInfo() + "<br>"); document.write("&nbsp;&nbsp;getHost() = " + r.getHost() + "<br>"); document.write("&nbsp;&nbsp;getPort() = " + r.getPort() + "<br>"); document.write("&nbsp;&nbsp;getParameter(/"notexistparam/") = " + r.getParameter("notexistparam") + "<br>"); document.write("&nbsp;&nbsp;getParameterValues(/"notexistparam/") = " + r.getParameterValues("notexistparam") + "<br>"); var names = r.getParameterNames(); document.write("&nbsp;&nbsp;getParameterNames()[size=" + names.length + "] = " + names + "<br>"); for (i=0; i<names.length; i++) { document.write("&nbsp;&nbsp;---value of parameter [" + names[i] + "]---<br>"); document.write("&nbsp;&nbsp;&nbsp;&nbsp;getParameter(/"" + names[i] + "/") = " + r.getParameter(names[i]) + "<br>"); document.write("&nbsp;&nbsp;&nbsp;&nbsp;getParameterValues(/"" + names[i] + "/") = " + r.getParameterValues(names[i]) + "<br>"); } document.write("<br>"); } catch (e) { document.write("Catch Exception: <br>"); printObj(e); } } function printObj(o, indent) { if (indent == null || indent == undefined) { indent = ""; document.write("<br>"); document.write("--------obj=" + o + " ------ <br>"); } var cindent = indent + "&nbsp;&nbsp;"; for (i in o) { if (typeof(o[i]) == "object") { document.write(cindent + "o[" + i + "] = <br>"); printObj(o[i], cindent); } else { document.write(cindent + "o[" + i + "] = " + o[i] + "<br>" ); } } } </script> </head> <body> <script type="text/javascript"> testURIParser("mailto:[email protected]"); testURIParser("news:comp.lang.java"); testURIParser("urn:isbn:096139210x"); testURIParser("http://java.sun.com/j2se/1.3/"); testURIParser("docs/guide/collections/designfaq.html#28"); testURIParser("../../../demo/jfc/SwingSet2/src/SwingSet2.java"); testURIParser("file:///~/calendar"); testURIParser("http://user:[email protected]:8080/abc/abs_path?query=string&name=space%20value&novalue=#fragementx"); testURIParser("//user:[email protected]:8080/abc/abs_path?query=string&name=space%20value&novalue=#fragementx"); testURIParser("http:///abc/abs_path?query=string&name=space%20value&novalue=#fragementx"); testURIParser("http://example.com:8080/abc/abs_path?query=string&name=space%20value&novalue=#fragementx"); testURIParser("http://user:[email protected]:8080?query=string&name=space%20value&novalue=#fragementx"); testURIParser("http://user:[email protected]:8080/abc/abs_path?query=string&name=space%20value&novalue="); testURIParser("http://user:[email protected]:8080/abc/abs_path#fragementx"); testURIParser("http://user:[email protected]:8080/abc/abs_path/#fragementx"); testURIParser("http://example.com/abc/abs_path?query=string&name=space%20value&novalue=&noequalchar#fragementx"); testURIParser("http://example.com/abc/abs_path?query=string&name=space%20value&novalue=&samename=value1&samename=value2#fragementx"); testURIParser("query=string&name=space%20value&novalue=&samename=value1&samename=value2"); </script> <br> </body> </html>

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(JavaScript,function,Scheme,null,query,Parsing)