uri
解析器做为一个Web开发工程师,对下面的代码应该不会陌生:前端
$kw = $_GET['keyword']; // PHP String kw = request.getParameter("keyword"); // JSP
对于后端语言,咱们能够很方便的获取到一个url
请求中的参数值。可是,在前端工程中须要获取到url参数的时候,JS 倒是没有对应的接口。幸运的是,咱们能够经过封装一些字符串操做的方法就能够实现。程序员
查询例子正则表达式
var str = "http://search.jd.com/search?keyword=ipad%20min3%E4%BF%9D%E6%8A%A4%E5%A5%97&enc=utf-8&qrst=1&rt=1&stop=1&stock=1#filter";
说明后端
对正则表达式构建可谓是仁者见仁智者见智。因此,100个的程序员有100种写法,笔者这里只是自圆自说,抛砖引玉。优化
String.match
方法url
基本思路是从目标字符串中匹配与 key
对应的参数的值并返回。使用正则表达式匹配,能够省去循环。code
/** * 查询 url 字符串对应的键值 * @param {[String]} name [键值名] * @param {[String]} url [url字符串] * @return {[String]} [对应的值] */ var query = function(name,url) { var pattern = new RegExp("[\\?&#]" + name + "=([^&#]+)","gi"); var ma = (url || location.search).match(pattern); var strArr; if (ma && ma.length > 0) { strArr = (ma[ma.length-1]).split("="); if (strArr && strArr.length > 1) { return strArr[1]; } return '' } return ''; } query("keyword",str)
上面的方法基本上可以知足平常使用的需求了,再来看看其余方法的实现。接口
RegExp.exec
方法ip
每次匹配以后提供的额外信息,能够更加灵活的操做字符串。合理的封装一些方法和接口暴露,知足项目的需求。utf-8
/** * 查询 url 字符串对应键值 * @param url * @returns {{get: Function, keys: Function}} */ function query(url) { if (typeof url !== "string") return; var RE_URL = /([^&=]+?)(?=(=|&|$|#))=([^&$#]*)?/gi; var RE_HTTP = /(https?):\/\//; var ma = null; var r = {} var k,v; if (url.match(RE_HTTP)) { url = url.slice(url.indexOf('?')+1) } else { url = location.search; } while ((ma = RE_URL.exec(url)) !== null) { k = ma[1]; v = ma[3]; if (!r[k]) { r[k] = v } } return { get: function(key) { if (r[key]) return r[key]; return ""; }, keys: function() { var keys = []; if ('keys' in {}) { keys = {}.keys(r) } else { for (var i in r) { keys.push(i) } } return keys; } } } var q = query(str) q.get("keyword") // ipad%20min3%E4%BF%9D%E6%8A%A4%E5%A5%97 q.keys() // ["keyword", "enc", "qrst", "rt", "stop", "stock"]
正则表达式的书写是因人而异的,以上只是一个雏形,有兴趣的朋友能够进行扩展优化。欢迎你们发表各自的意见,多多交流,共同进步!