一直以来都只提供了天气预报的RSS输出,有很多网友都问我如何将这些数据应用到自己的网站上面,下面我来提供一个简单的例子
效果如下图所示。演示网址 http://www.anziji.com/
不过不同的是这个演示用的AJAX实现,所以在程序中文字通过mb_convert_encoding转换成的UTF-8

// 自定义函数用于读取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 .=" <ul><br/><li>" . mb_convert_encoding($day[$i],"UTF-8","GB2312") . "</li> <li>{$weather[1][$i]}</li> <li>{$temperature[1][$i]}</li> <li>{$wind[1][$i]}</li> <li>{$trend[1][$i]}</li> </ul> "; } echo $string;

你好 我是在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]);
所以想向你请教一下
希望能够得到你的回复
你问的这部分代码应该是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行:将标签对内的字串进行模板变量的替换处理
http://www.637400.com/tianqi.php
老大看下!
汗,你这是PHP么? :em68:
前后得加上 < ? ? >
改为半角符号
其实我更关心的是,你这个站点的天气预报RSS数据,能维持 多久的时间?你的数据源从何而来?
只要我这个Blog还在,这个RSS Weather应该会一直提供,数据来源可以看提供的源码。
我安装了之后,页面也是显示乱码,显示两个问号,如:??
就是地区那一列
你那个正则写得对吗?怎么四个是一样的?
能不能把代码打个包下载?
因为你粘上去后会被程序显示错误的,不如那个小于号都被编码了,还有其他地方也有错误
我重新上传了了源码包,可以在这个地址下载
http://www.raychou.com/weather/code.rar
这个是我现在用的版本,应该是没有问题的
是你的数据操作类的问题,你那个类是05年写的,估计当时没考虑到 mysql4.1之后的多字符集的问题,需要在dbQuery 这个方法里加一句 mysql_query(‘SET NAMES gb2312;’); 就可以了。
另外,你这篇文章里的下面这些代码是对的吗?
我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);
恩,这个DB类是很久以前写的,确实没有注意MySQL4.1以后默认字符集的问题,我本机和服务器的环境也一直用的是4.0.x。谢谢你的意见。过阵子有时间准备把这个RSS Weather重写一下。
这篇文章中的代码是从以前的一个应用实例中copy过来的,应该是没有问题的。但说实话,现在让我看似乎也是有点问题……
找个时间我会把这篇文章更新一下。
:em23:
老大 恕我愚钝 我看了你的代码 你的天气信息来源似乎是中国气象影视信息网 上面提供的天气预报也就是4天的 大大是如何取到5天的?
http://www.weathercn.com/forecast/qushi.jsp?sta_id=57687
5天的
RayChou 谢谢你回答我上一个问题 最近想做一个天气预报的flash 却有点无从下手 看到你这篇博文 象看到了救命稻草 这次想请教:如何提取你的RSS作为我的数据源呢?大大能给个思路吗? :em27:
flash中怎么处理xml我不太清楚,但正则应该是支持的
你可以试试用正则表达式取出xml中的数据
然后加入到你的flash中
老大 能不能帮我把这个改成只显示未来24小时的啊
我想用在bblean上 谢谢
只要24小时的天气的话,只取第一条记录就可以了啊
请问具体怎么修改 我想在rss的时候就截取
老大,我在用了你的代码后,在点击具体城市显示天气预报的时候出现了:
Fatal error: Call to undefined function mb_convert_encoding() in D:\MYOA\webroot\weather\html2xml.php on line 68
不知道是什么原因阿?
你的服务器不支持mb_convert_encoding这个函数
可以改用iconv
修改html2xml.php on line 68
老大,经过修改后还是报错阿,不过这次是:
无法显示 XML 页。
使用 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。
——————————————————————————–
XML 文档必须有一个顶层元素。处理资源 ‘http://192.168.1.100/weather/rss.php?id=54602′ 时出错。
raychou大人,天气预报这两天出错了,是怎么回事呀?急盼解决。报错内容就是楼上的筒子说的。 :em56:
数据源更改了格式,我尽快更新一下程序
程序已修正