3

我一直在为我使用的一个程序开发一个天气预报器,它在很大程度上运行良好。这是我到目前为止所拥有的。(不要注意 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">< img src="http://icons-ecast.wxug.com/i/c/a/[%w_]+.gif"
它将完美匹配条件。(无论出于何种原因,我无法正确显示上面的行,但 `< 和 img 之间没有空格)

谁能指出它有什么问题?除了模式匹配之外,我向您保证该行是从网页逐字记录的。

我遇到的另一个问题是跨换行符匹配的能力。有没有办法做到这一点?我问的原因是因为在同一页面上,我需要匹配的一些东西被分成不同的行,并且由于我想要匹配的实际模式出现在页面的其他位置,我需要能够跨换行符匹配以获得确切的模式。

4

1 回答 1

1

您可以大大简化您的匹配(见下文),但总的来说,您似乎有两个问题......

  • 缺少您要捕获的匹配项周围的 ()。
  • 你需要逃避 . 通过使它们成为匹配中的字符 %.

我试过这个,它奏效了......

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

至于多行,这应该不是问题,换行符只是控制字符,如果您将多行读入同一字符串,则此匹配有效。

于 2010-04-02T22:46:02.523 回答