Несколько проблем с сопоставлением с шаблоном в Lua - PullRequest
3 голосов
/ 03 апреля 2010

Я работал над прогнозом погоды для программы, которую я использую, и по большей части она работает хорошо. Вот что у меня так далеко. (Не обращайте внимания на zs.stuff. Это относится к конкретной программе и не имеет отношения к кодированию Lua.)

if not http then http = require("socket.http") end  

local locale = string.gsub(zs.params(1),"%s+","%%20")
local page = http.request("http://www.wunderground.com/cgi-bin/findweather/getForecast?query=" .. locale .. "&wuSelect=WEATHER")
local location = string.match(page,'title="([%w%s,]+) RSS"')
--print("Gathering weather information for " .. location .. ".")
--local windspeed = string.match(page,'<span class="nobr"><span class="b">([%d.]+)</span>&nbsp;mph</span>')
--print(windspeed)
local condition = string.match(page, '<td class="vaM taC"><img src="http://icons-ecast.wxug.com/i/c/a/[%w_]+.gif" width="42" height="42" alt="[%w%s]+" class="condIcon" />')
--local image = string.match(page, '<img src="http://icons-ecast.wxug.com/i/c/a/(.+).gif" width="42" height="42" alt="[%w%s]+" class="condIcon" />')
local temperature = string.match(page,'pwsvariable="tempf" english="&deg;F" metric="&deg;C" value="([%d.]+)">')
local humidity = string.match(page,'pwsvariable="humidity" english="" metric="" value="(%d+)"')
zs.say(location)
--zs.say("image ./Images/" .. image .. ".gif")
zs.say("<color limegreen>Condition:</color> <color white>" .. condition .. "</color>")
zs.say("<color limegreen>Temperature: </color><color white>" .. temperature .. "F</color>")
zs.say("<color limegreen>Humidity: </color><color white>" .. humidity .. "%</color>")

Моя основная проблема заключается в следующем: я изменил условие и добавил переменные изображения к тому, что они есть сейчас. Несмотря на то, что строка, с которой она должна совпадать, поступает непосредственно с веб-страницы, она вообще не совпадает. Поэтому мне интересно, что мне не хватает, что мешает работе этого кода. Если я достану
<td class="vaM taC"> image это будет соответствовать состоянию безупречно. (По какой-то причине я не могу правильно отобразить вышеуказанную строку, но между `<и img нет пробела) </p>

Кто-нибудь может указать, что с ним не так? Помимо сопоставления с шаблоном, я уверяю вас, эта строка дословно с веб-страницы.

Еще один вопрос, который у меня возник, - это возможность сопоставлять разрывы строк. Есть ли какой-нибудь возможный способ сделать это? Причина, по которой я спрашиваю, заключается в том, что на той же странице несколько вещей, которые мне нужно сопоставить, разбиты на отдельные строки, и поскольку фактический шаблон, который я хочу сопоставить, отображается в других местах на странице, чтобы иметь возможность совпадать через разрывы строк, чтобы получить точную картину.

1 Ответ

1 голос
/ 03 апреля 2010

Вы можете значительно упростить свой матч (см. Ниже), но в целом похоже, что у вас есть две проблемы ...

  • Отсутствует () вокруг матча, который вы хотите захватить.
  • Вам нужно сбежать. символов в вашем матче, сделав их%.

Я попробовал это, и это сработало ...

local page = [[<td class="vaM taC"><img src="http://icons-ecast.wxug.com/i/c/a/hello_world.gif" width="42" height="42" alt="HELLO WOLRD" class="condIcon" />]]
local condition, image = string.match(page, '.+/([%w_]+)%.gif".+alt="([%w%s]+)".+')
print(condition, image)

это напечатано ...

hello_world    HELLO WORLD

Что касается многострочных, это не должно быть проблемой, новые строки являются просто управляющими символами, и если вы читаете несколько строк в одну и ту же строку, это совпадение работает.

...