网站首页lua/js

lua函数库

发布时间:2017-08-13 15:33:49编辑:slayer.hover阅读(852)

           习惯了PHP开发的同学,在刚使用lua来coding的时候一定非常不爽,各种常用的函数库都没了。 

    有问题就解决,没有问题的,就先创造问题再解决,我们自己来写lua的仿PHP函数库。

    下面列出一些常用的函数代码及测试用例:

    https://github.com/slayerhover/ucenterbylua/blob/master/application/library/function.lua


    ----function.lua代码如下:
    
    local cjson    = require "cjson"
    local http    = require "resty.http"
    local _M = { _VERSION="1.0.0"};
    
    ----判断table是否为空
    function _M.empty(t)
        if t == nil or _G.next(t) == nil then
            return true
        else
            return false
        end
    end
    
    ----格式化输出,调试代码使用
    function _M.dump(t)    
            local function parse_array(tab)
                local str = ''
                for _, v in pairs(tab) do
                    str    =    str .. '\t\t' .. _ .. ' => ' .. v .. '\n'
                end            
                return str
            end
            
            local str = type(t);        
            if str=='table' then        
                str = str .. '(' .. #t .. ')' .. '\n{\n' 
                for k,v in pairs(t) do
                    if type(v)=="table" then
                        str = str .. '\t' .. k .. ' = > {\n' .. parse_array(v) .. '\t}' .. '\n'
                    else
                        str = str .. '\t' .. k .. ' => ' .. (v) ..  '\n'
                    end
                end
            else
                str = str .. '\n{\n' .. tostring(t) .. '\n'
            end        
            str = str .. '}'
            
            ngx.say('\n' .. str .. '\n')
    end    
    
    ----curl获取网址内容
    function _M.curl(url, params, method)
        local httpc    =    http.new()
        httpc:set_timeout(2000) --2秒超时
        local resp, err = httpc:request_uri(url, {  
            method    = method or 'GET',
            body     = params,
            ssl_verify = false, --兼容https
            headers = {  
                ["User-Agent"]  = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36",
                ["Content-Type"]= "application/x-www-form-urlencoded"
                
            }  
        })
        if not resp then          
            return false
        end  
              
        httpc:close()
        return resp.body
    end
    
    ----获取table大小 
    function _M.sizeof(t)
        local count = 0
        for _, v in pairs(t) do
            count = count + 1
        end            
        return count;
    end
    function _M.count(t)
        local count = 0
        for _, v in pairs(t) do
            count = count + 1
        end            
        return count;
    end
    
    ----json_encode,返回字符串
    function _M.json_encode(t)
        cjson.encode_empty_table_as_object(true)
        local str = cjson.encode(t)
        return str
    end
    
    ----json_decode,返回table
    function _M.json_decode(str)
        local json = false
        pcall(function(str) json = cjson.decode(str) end, str)
        return json
    end
    
    ----分隔字符串,返回table
    function _M.explode(split, str)
        local str_split_tab = {}
        while true do
            local idx = string.find(str,split,1,true);
            if nil~=idx then
                local insert_str = '';
                if 1==idx then
                    insert_str = string.sub(str, 1,idx + #split - 1);
                else
                    insert_str = string.sub(str, 1,idx - 1);
                end
                if (insert_str ~= split) and (nil ~= insert_str or '' ~= insert_str) then
                    table.insert(str_split_tab,insert_str);
                end
                str = string.sub(str,idx + #split,-1);
            else
                if nil ~= str or '' ~= str then
                    table.insert(str_split_tab,str);
                end
                break;
            end
        end
        return str_split_tab;
    end
    
    ----合并table,返回字符串
    function _M.implode(split, t)
        local tab = {}
        for _, v in pairs(t) do
            table.insert(tab, v)
        end            
        return table.concat(tab, split);
    end
    
    ----字符串查找替换
    function _M.str_replace(str, find, replace)
        local res,res_count = string.gsub(str,find,replace);
        return res,res_count
    end
    
    ----字符串查找位置
    function _M.strpos(str, find)
        local res,res_end = string.find(str, find)
        if ''==res or nil==res then
            return false;
        end    
        return res;
    end
    
    ----字符串查找位置,不区分大小写
    function _M.stripos(str, find)
        local str = string.lower(str);
        local find= string.lower(find);
        
        local res,res_end = string.find(str, find)
        if ''==res or nil==res then
            return false;
        end    
        return res;
    end
    
    ----正则匹配一次
    function _M.preg_match(regex, str)
        local res,err = ngx.re.match(str, regex, "io")
        if res then
            return res;
        else
            ngx.log(ngx.ERR, "error: ", err)
            return false;
        end
    end
    
    ----正则匹配所有
    function _M.preg_match_all(regex, str)
        local it,err = ngx.re.gmatch(str, regex, "io")
        if not it then
            ngx.log(ngx.ERR, "error: ", err)
            return false;
        end
        local res = {};    
        while true do
            local m, err = it()
            if err then
                ngx.log(ngx.ERR, "error: ", err)
                return false;
            end 
            if not m then
                break
            end
            table.insert(res, m);
        end            
        return res;
    end
    
    ----正则替换
    function _M.preg_replace(regex, replacement, str, option)
        local newstr, n, err = ngx.re.gsub(str, regex, replacement, option)
        if newstr then
            return newstr;        
            -- newstr == "[hello,h], [world,w]"
            -- n == 2
        else
            ngx.log(ngx.ERR, "error: ", err)
            return false;
        end
    end
    
    ----清除空白字符
    function _M.trim(str)
        str = _M:ltrim( str );
        str = _M:rtrim( str );
        return str;
    end
    
    ----清除左侧空白字符
    function _M.ltrim( str )
        if ''==str or nil==str then
            return str;
        end
        local len = string.len( str );
        
        local substart = 1;
        local  lenadd = 1;
        while ( string.find ( str," ",lenadd) == lenadd ) do
            substart = substart + 1;
            lenadd= lenadd + 1;
        end
        
        str=string.sub ( str ,substart ,len);
        
        local substart1 = 1;
        local lenadd1 = 1;
        len=string.len(str);
        while(string.find(str,"%s",lenadd1 )==lenadd1) do
                    substart1 = substart1 +1
                    lenadd1 = lenadd1 +1
        end
        
        str=string.sub(str,substart1,len);
        
        return str;
    end
    
    ----清除右侧空白字符
    function _M.rtrim( str )
        if ''==str or nil==str then
            return str;
        end
        local len = string.len(str);
        
        local substart = len;
        local  lenadd = len;
        while ( string.find ( str,"%s",lenadd) == lenadd ) do
            substart = substart - 1;
            lenadd= lenadd - 1;
        end
        str =string.sub(str , 1,substart );
        len=string.len(str);
        local substart1 = len;
        local lenadd1 = len;
        while(string.find(str," ",lenadd1 )==lenadd1) do
                    substart1 = substart1 -1
                    lenadd1 = lenadd1 -1
        end
        
        str=string.sub(str,1,substart);
        return str;
    end
    
    ----字符串转为大写
    function _M.upper(str)
        if ''==str or nil==str then
            return str;
        end
        return string.upper(str);
    end
    
    ----字符串转为小写
    function _M.lower(str)
        if ''==str or nil==str then
            return str;
        end
        return string.lower(str);
    end
    
    return _M;


    测试用例:

    ----test.lua
    package.path= '/opt/lualib/?.lua;d:/opt/lapi/inc/?.lua;';
    local func= require "function";
    local str = func.curl("https://www.baidu.com/s");
    ngx.say(str);
    local str = '{    "a": 123,    "c": "d",    "e": "f"}';
    local res = func.json_decode(str);
    func.dump(res);
    local t = {a="b",c="de", f="ji"};
    local res = func.json_encode(t);
    func.dump(res);
    local newtab = func.implode('|', t);
    func.dump(newtab);
    func.dump((func.explode('|', newtab)));
    local result = func.preg_match("([a-z]+)", "abc 1234, hello");
    if result then
    func.dump(result);
    else
    ngx.say("no matched.");
    end
    local result = func.preg_match_all("(?<numbers>[\\d]+)", "abc 1234, hello, 78d90");
    if result then
    func.dump(result);
    else
    ngx.say("no matched.");
    end




评论