正则表达式笔记(四)

前端之家收集整理的这篇文章主要介绍了正则表达式笔记(四)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

打造一个uri解析器

作为一个Web开发工程师,对下面的代码应该不会陌生:

  1. $kw = $_GET['keyword']; // PHP
  2. String kw = request.getParameter("keyword"); // JSP

对于后端语言,我们可以很方便的获取到一个url请求中的参数值。但是,在前端工程中需要获取到url参数的时候,JS 却是没有对应的接口。幸运的是,我们可以通过封装一些字符串操作的方法就可以实现。

查询例子

  1. 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 方法

基本思路是从目标字符串中匹配与 key 对应的参数的值并返回。使用正则表达式匹配,可以省去循环。

  1. /**
  2. * 查询 url 字符串对应的键值
  3. * @param {[String]} name [键值名]
  4. * @param {[String]} url [url字符串]
  5. * @return {[String]} [对应的值]
  6. */
  7. var query = function(name,url) {
  8. var pattern = new RegExp("[\\?&#]" + name + "=([^&#]+)","gi");
  9. var ma = (url || location.search).match(pattern);
  10. var strArr;
  11.  
  12. if (ma && ma.length > 0) {
  13. strArr = (ma[ma.length-1]).split("=");
  14. if (strArr && strArr.length > 1) {
  15. return strArr[1];
  16. }
  17. return ''
  18. }
  19. return '';
  20. }
  21.  
  22. query("keyword",str)

上面的方法基本上能够满足日常使用的需求了,再来看看其他方法的实现。

RegExp.exec 方法

每次匹配之后提供的额外信息,可以更加灵活的操作字符串。合理的封装一些方法和接口暴露,满足项目的需求。

  1. /**
  2. * 查询 url 字符串对应键值
  3. * @param url
  4. * @returns {{get: Function,keys: Function}}
  5. */
  6. function query(url) {
  7. if (typeof url !== "string") return;
  8.  
  9. var RE_URL = /([^&=]+?)(?=(=|&|$|#))=([^&$#]*)?/gi;
  10. var RE_HTTP = /(https?):\/\//;
  11. var ma = null;
  12. var r = {}
  13. var k,v;
  14.  
  15. if (url.match(RE_HTTP)) {
  16. url = url.slice(url.indexOf('?')+1)
  17. } else {
  18. url = location.search;
  19. }
  20.  
  21. while ((ma = RE_URL.exec(url)) !== null) {
  22. k = ma[1];
  23. v = ma[3];
  24. if (!r[k]) {
  25. r[k] = v
  26. }
  27. }
  28. return {
  29. get: function(key) {
  30. if (r[key]) return r[key];
  31. return "";
  32. },keys: function() {
  33. var keys = [];
  34. if ('keys' in {}) {
  35. keys = {}.keys(r)
  36. } else {
  37. for (var i in r) {
  38. keys.push(i)
  39. }
  40. }
  41. return keys;
  42. }
  43. }
  44. }
  45.  
  46. var q = query(str)
  47. q.get("keyword") // ipad%20min3%E4%BF%9D%E6%8A%A4%E5%A5%97
  48. q.keys() // ["keyword","enc","qrst","rt","stop","stock"]

正则表达式的书写是因人而异的,以上只是一个雏形,有兴趣的朋友可以进行扩展优化。欢迎大家发表各自的意见,多多交流,共同进步!

猜你在找的正则表达式相关文章