制作自己的天气预报站点

一直以来都只提供了天气预报的RSS输出,有很多网友都问我如何将这些数据应用到自己的网站上面,下面我来提供一个简单的例子

效果如下图所示。演示网址 http://www.anziji.com/

不过不同的是这个演示用的AJAX实现,所以在程序中文字通过mb_convert_encoding转换成的UTF-8

weather.jpg

// 自定义函数用于读取rss文件内容
function getFile($url){
if($f=@fopen("$url","r"))
{
while(!@feof($f))
{
$s.=@fgets($f);
}
@fclose($f);
}
return $s;
}
 
// 读取rss文件内容到变量,通过URL传递id参数
$xml = getFile("http://www.raychou.com/weather/rss.php?id={$_GET['id']}");
 
// 使用正则获取相关天气信息到数组
preg_match_all('/([sS]*?)/',$xml,$weather);
preg_match_all('/([sS]*?)/',$xml,$temperature);
preg_match_all('/([sS]*?)/',$xml,$wind);
preg_match_all('/([sS]*?)/',$xml,$trend);
$day = array('今天','明天','后天');
 
// 输出
for($i = 0;$i < 3;$i++) {
$string .="
&lt;ul&gt;<br/>&lt;li&gt;" . mb_convert_encoding($day[$i],"UTF-8","GB2312") . "&lt;/li&gt;
&lt;li&gt;{$weather[1][$i]}&lt;/li&gt;
&lt;li&gt;{$temperature[1][$i]}&lt;/li&gt;
&lt;li&gt;{$wind[1][$i]}&lt;/li&gt;
&lt;li&gt;{$trend[1][$i]}&lt;/li&gt;
&lt;/ul&gt;
";
}
echo $string;

相关文章

25 Responses to “制作自己的天气预报站点”

  1. 小梁 说:

    你好 我是在http://www.knowsky.com/下载你的RSS天气预报的
    看了之后觉得你做得真的是很不错 思路严谨清晰 
    但是因为我刚接触正则表达式不久 而且PHP方面的水平现在也一般
    所以有些地方看不懂,如:
    $GLOBALS{$template_file_parse[2][$i]} = $GLOBALS{$template_file_parse[1][$i]}[$key];
    $template_file_parse['string'][$i] .= $this->templateParse_value($template_file_parse[3][$i]);
    所以想向你请教一下
    希望能够得到你的回复

  2. RayChou 说:

    你问的这部分代码应该是include下的template.inc.php文件
    这是我去年写的一个模板引擎类,现在基本不用了,可能记不太清楚了,如果下面解释得有错,见谅~呵呵 :em62:

    先看74行的代码

    [coolcode lang="php" linenum="off"]preg_match_all(‘/’.$this->template_parse_begin.’[ ]*foreach[ ]*from=([\w-]*)[ ]*item=([\w-]*)[ ]*’.$this->template_parse_end.’([\s\S]*?)’.$this->template_parse_begin.’\/foreach’.$this->template_parse_end.’/',$this->template_file_string,$template_file_parse);[/coolcode]

    通过正则匹配foreach语法并将参数赋值到$template_file_parse变量

    其下标值分别对应

    0:全部模式匹配的数组
    1:from参数,遍历的数组名
    2:item参数,单元值赋值给的变量名
    3:foreach标签对内字串

    第87行:如果from中的变量为数组,则遍历此数组,如果遍历到的单元值不为空,则将单元值赋值给item中对应下标变量中以单元键值为下标的数组中。(有些绕口)

    第88行:将标签对内的字串进行模板变量的替换处理

  3. RayChou 说:

    汗,你这是PHP么? :em68:
    前后得加上 < ? ? >
    改为半角符号

  4. Volcano 说:

    其实我更关心的是,你这个站点的天气预报RSS数据,能维持 多久的时间?你的数据源从何而来?

  5. RayChou 说:

    只要我这个Blog还在,这个RSS Weather应该会一直提供,数据来源可以看提供的源码。

  6. im286 说:

    我安装了之后,页面也是显示乱码,显示两个问号,如:??
    就是地区那一列

  7. im286 说:

    你那个正则写得对吗?怎么四个是一样的?
    能不能把代码打个包下载?
    因为你粘上去后会被程序显示错误的,不如那个小于号都被编码了,还有其他地方也有错误

  8. RayChou 说:

    我重新上传了了源码包,可以在这个地址下载
    http://www.raychou.com/weather/code.rar
    这个是我现在用的版本,应该是没有问题的

  9. im286 说:

    是你的数据操作类的问题,你那个类是05年写的,估计当时没考虑到 mysql4.1之后的多字符集的问题,需要在dbQuery 这个方法里加一句 mysql_query(‘SET NAMES gb2312;’); 就可以了。

  10. im286 说:

    另外,你这篇文章里的下面这些代码是对的吗?
    我xml取得没问题,但是具体的 天气 温度 风向等取到的都是空值

    // 使用正则获取相关天气信息到数组
    preg_match_all(‘/([sS]*?)/’,$xml,$weather);
    preg_match_all(‘/([sS]*?)/’,$xml,$temperature);
    preg_match_all(‘/([sS]*?)/’,$xml,$wind);
    preg_match_all(‘/([sS]*?)/’,$xml,$trend);

  11. RayChou 说:

    恩,这个DB类是很久以前写的,确实没有注意MySQL4.1以后默认字符集的问题,我本机和服务器的环境也一直用的是4.0.x。谢谢你的意见。过阵子有时间准备把这个RSS Weather重写一下。

    这篇文章中的代码是从以前的一个应用实例中copy过来的,应该是没有问题的。但说实话,现在让我看似乎也是有点问题……
    找个时间我会把这篇文章更新一下。
    :em23:

  12. ebony 说:

    老大 恕我愚钝 我看了你的代码 你的天气信息来源似乎是中国气象影视信息网 上面提供的天气预报也就是4天的 大大是如何取到5天的?

  13. ebony 说:

    RayChou 谢谢你回答我上一个问题 最近想做一个天气预报的flash 却有点无从下手 看到你这篇博文 象看到了救命稻草 这次想请教:如何提取你的RSS作为我的数据源呢?大大能给个思路吗? :em27:

  14. RayChou 说:

    flash中怎么处理xml我不太清楚,但正则应该是支持的
    你可以试试用正则表达式取出xml中的数据
    然后加入到你的flash中

  15. 天毅 说:

    老大 能不能帮我把这个改成只显示未来24小时的啊
    我想用在bblean上 谢谢

  16. RayChou 说:

    只要24小时的天气的话,只取第一条记录就可以了啊

  17. 天毅 说:

    请问具体怎么修改 我想在rss的时候就截取

  18. wahaha1588 说:

    老大,我在用了你的代码后,在点击具体城市显示天气预报的时候出现了:
    Fatal error: Call to undefined function mb_convert_encoding() in D:\MYOA\webroot\weather\html2xml.php on line 68
    不知道是什么原因阿?

  19. RayChou 说:

    你的服务器不支持mb_convert_encoding这个函数
    可以改用iconv
    修改html2xml.php on line 68

  20. wahaha1588 说:

    老大,经过修改后还是报错阿,不过这次是:
    无法显示 XML 页。
    使用 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。

    ——————————————————————————–

    XML 文档必须有一个顶层元素。处理资源 ‘http://192.168.1.100/weather/rss.php?id=54602′ 时出错。

  21. ebony 说:

    raychou大人,天气预报这两天出错了,是怎么回事呀?急盼解决。报错内容就是楼上的筒子说的。 :em56:

  22. RayChou 说:

    数据源更改了格式,我尽快更新一下程序

  23. RayChou 说:

    程序已修正

Leave a Reply