利用正则实现简单模板替换功能

前端之家收集整理的这篇文章主要介绍了利用正则实现简单模板替换功能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最近做了不少H5项目,功能比较简单,为减少体积且便于利用无线团队的其他模块前端库基于zepto。这个项目中有因为页面是由前端渲染了的,所以自然有很多拼字符串的操作。在zepto中找了半天也没有找到一个类似kissy中subsititute函数功能,于是自己写了一个。用起来还算顺手,所以放上来大家交流下。为了避免与HTML属性的JSON格式冲突,通配符借鉴了ruby的方案,使用了#{}。对zepto还不是很熟悉,有更好的方案欢迎大家留言指出。

/** * @fileOverview 简单字符串工具类. * @since 2014.06.19 */

;(function($,util){

var REG_PROP_NAME = (
      '(?:' //属性名称可以是字母或由引号引起的字符串
    +     '\\w+'
    "|'(?:[^\\']|\\\\.)+'"
    '|"(?:[^\\"]|\\\\.)+"'
    + ')'
);

var readProp = function(obj,propStr){
    var i,c,prop,val,len;
    var reg new RegExp(REG_PROP_NAME,'g');
    var props = propStr.match(reg).map(function(i){ 
        return i.trim().replace(/^['"]|['"]$/g,240)">''); 
    });

    len = props.length;    
    if( len == 1 ){
        val = obj[props[0]];
        return (typeof val != undefined) ? val : '';
    }

    for(i=0,c=len-1; i < c; i++){
        prop = props[i];
        if(typeof obj[prop] = undefined){
            return '';
        }
        obj = obj[prop];        
    }    

    val = obj[props[len1]];
    '';
};

var StrUtil = {
    /** * 将模板中的变量替换为值后返回. * @param {String}tmpl * @parma {JSON}props * @return {String} * @public * @example * var tmpl = 'hello #{name},#{age},\#{name}'; * var props = {name: 'zhang-san',age: 20}; * console.log(util.str.sub(tmpl,props); // => hello zhang-san,20,#{name} * * var tmpl2 = ( * 'name: #{user.name} \n' * + 'age : #{user.age } \n' * + 'address: \n' * + ' home-town: #{user.address."home-town"} \n' * + ' current-city: #{user.address.city} \n' * ); * * var props = { * user: { * name: 'zhang-san',* age: 20,* address: { * "home-town" : "hebei",* city: 'bei-jing' * } * } * }; * * console.log(util.str.sub(tmpl2,props)); */
    sub : function(tmpl,obj){    
        new RegExp((
               '\\\\(.)'      //转义字符
            +  '|#\\{\\s*('   //或者#{prop1.prop2."prop3"}
            +       REG_PROP_NAME   
            +      '(?:' 
            +           '\\.'
            +           REG_PROP_NAME
            ')*'
            ')\\s*\\}'
        ),240)">'gi');

        var func function(m,$1,221); font-weight:700">2){
            return ($1 = undefined) ? $1 : readProp(obj,221); font-weight:700">2); 
        };

        return tmpl.replace(reg,func);
    }
};

util.str = StrUtil;

})(window.$,window.util || (window.util = {}));

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