2017-02-04 7 views
1

Я хочу извлечь параметры POST, полученные из HTTP-запроса, который был отправлен на мой NodeMCU. Как я могу это сделать? Я думал о следующем коде на C#. Как реализовать это в Lua?Как я могу получить определенный текст из строки в Lua?

Мой код в C#:

// Response = "<action>Play</action><speed>1</speed><blah>lol</blah>" 
// ValuetoSearch = "action" 
public static string GetInformationFromResponse(string Response, string ValueToSearch, bool RemoveHtmlCharacters = true) { 
      string returnValue = ""; 
      if (RemoveHtmlCharacters) { 
       Response = Response.Replace("<" + ValueToSearch + ">", ValueToSearch); 
       Response = Response.Replace("</" + ValueToSearch + ">", ValueToSearch); 
       Response = Response.Replace("&lt;" + ValueToSearch + "&gt;", ValueToSearch); 
       Response = Response.Replace("&lt;/" + ValueToSearch + "&gt;", ValueToSearch); 
      } 

      // Response = "actionPlayaction<Speed>1</Speed><blah>lol</blah>" 

      int indexOfWord = Response.IndexOf(ValueToSearch); // indexOfWord = 0 
      int start = indexOfWord + ValueToSearch.Length; // start = 6 
      int end = Response.Length - indexOfWord - 1; // 47 
      int totalLength = Response.Length; // 48 
      string newPositionInfo = ""; 

      if (indexOfWord == -1) { 
       return ""; 
      } else { 
       newPositionInfo = Response.Substring(start, totalLength - start); // newPositionInfo = "Playaction<Speed>1</Speed><blah>lol</blah>" 
       indexOfWord = newPositionInfo.IndexOf(ValueToSearch); // indexOfWord = 4 
       returnValue = newPositionInfo.Substring(0, indexOfWord); // returnValue = "Play" 
       if (RemoveHtmlCharacters) { 
        returnValue = returnValue.Replace("&lt;", ""); 
        returnValue = returnValue.Replace("&gt;", ""); 
        returnValue = returnValue.Replace("&amp;", ""); 
       } 
       return returnValue; // "Play" 
      } 
     } 

Использование этого кода выглядит следующим образом: - Я хочу, чтобы получить все, что между словом «действия». - У меня есть текст, содержащий слово «действие».

string largeText = "<action>Play</action><speed>1</speed><blah>blah</blah>" 
string wordToSearch = "action" 
string value1 = GetInformationFromResponse(largeText, "action"); 
string value2 = GetInformationFromResponse(largeText, "speed"); 
string value3 = GetInformationFromResponse(largeText, "blah"); 
// Value 1 = "Play" 
// Value 2 = "1" 
// Value 3 = "blah" 

Но как я могу выполнить то же самое в Lua (на моем NodeMCU)?

Примечания: новичок на Lua и NodeMCU

ответ

0
function GetInformationFromResponse(response, tag) 
    return 
     ((response:match((("<@>(.-)</@>"):gsub("@",tag))) or "") 
     :gsub("&(%w+);", {lt = "<", gt = ">", amp = "&"})) 
end 

local text = "<action>Play</action><speed>1</speed><blah>blah&amp;blah</blah>" 
local value1 = GetInformationFromResponse(text, "action"); -- "Play" 
local value2 = GetInformationFromResponse(text, "speed"); -- "1" 
local value3 = GetInformationFromResponse(text, "blah"); -- "blah&blah" 
local value4 = GetInformationFromResponse(text, "foo"); -- "" 
+0

Спасибо! Работает как шарм! – Johnnybossboy

0

Вот несколько функций, которые будут делать это:

function get_text (str, init, term) 
    local _, start = string.find(str, init) 
    local stop = string.find(str, term) 
    local result = nil 
    if _ and stop then 
     result = string.sub(str, start + 1, stop - 1) 
    end 
    return result 
end 

function get_tagged (str, tag) 
    local open_tag = "<" .. tag ..">" 
    local close_tag = "</" .. tag .. ">" 
    local _, start = string.find(str, open_tag) 
    local stop = string.find(str, close_tag) 
    local result = nil 
    if _ and stop then 
     result = string.sub(str, start + 1, stop - 1) 
    end 
    return result 
end 

Примера взаимодействие:

> largeText = "<action>Play</action><speed>1</speed><blah>blah</blah>" 
> -- Using get_text() 
> print(get_text(largeText, "<action>", "</action>")) 
Play 
> -- Using get_tagged() 
> print(get_tagged(largeText, "action")) 
Play 
> print(get_tagged(largeText, "speed")) 
1 
> print(get_tagged(largeText, "blah")) 
blah 
> print(get_tagged(largeText, "oops")) 
nil 
Смежные вопросы