2015-03-07 1 views
2

У меня есть URL-адрес, и хотел бы разобрать его параметр из него, как:параметры Разбор из URL в Lua

function unescape (s) 
    s = string.gsub(s, "+", " ") 
    s = string.gsub(s, "%%(%x%x)", function (h) 
     return string.char(tonumber(h, 16)) 
     end) 
    return s 
end 

function parseurl (s,param) 
for k, v in string.gmatch(s, "([^&=?]+)=([^&=?]+)") do 
    --t[k] = v 
    if k == param then 
     --print (k.." "..v) 
     return unescape(v) 
    end 
end 

s = "http://www.page.com/link.php uname=Hans+Testmann&uemail=myemail%40gmail.com&utext=Now+this+is+working+great.%0D%0A++&mdt=1#&mydays:themeupload"s 

Чем я назвал бы его и получить результат, как после ->

parseurl (s, "uname")  --> "Hans Testmann" 
parseurl (s, "uemail")  --> "[email protected]" 
parseurl (s, "utext")  --> "Now this is working great" 

Я уже много исправил и, кажется, работает, , но вы могли бы посмотреть, как его можно улучшить?

+1

Пожалуй http://codereview.stackexchange.com/. – lhf

+0

Первый случай «uname» не работает. Вам нужно удалить URL-адрес для работы gmatch. Добавьте эту строку в parseurl() перед циклом for: s = s: match ('% s + (. +)') – tonypdmtr

ответ

3

Я хотел бы вернуть все параметры в таблице и использовать так:

function urldecode(s) 
    s = s:gsub('+', ' ') 
     :gsub('%%(%x%x)', function(h) 
          return string.char(tonumber(h, 16)) 
         end) 
    return s 
end 

function parseurl(s) 
    s = s:match('%s+(.+)') 
    local ans = {} 
    for k,v in s:gmatch('([^&=?]-)=([^&=?]+)') do 
    ans[ k ] = urldecode(v) 
    end 
    return ans 
end 

t = parseurl(s) 
print(t.uname) --> 'Hans Testmann' 
print(t.uemail) --> '[email protected]' 
print(t.utext) --> 'Now this is working great'