Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: XML с сайта gismeteo
 
 автор: denya   (15.12.2007 в 16:53)   письмо автору
 
 

Народ, кто-нибудь разобрался как парсить погодный xml с сайта gismeteo?
Тут была тема (http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=13533) на этот счет, но она как-то закончилась непонятно.

Если кто смог это сделать, может поделитесь?

   
 
 автор: SHAman   (15.12.2007 в 23:11)   письмо автору
 
   для: denya   (15.12.2007 в 16:53)
 

стучи в асю в понедельник. Дам готовый скрипт.

   
 
 автор: afdm   (16.12.2007 в 00:21)   письмо автору
 
   для: denya   (15.12.2007 в 16:53)
 

могу быстрее. прямо завтра с утра :) правда погода только на сутки. а у Вас SHАman как?

   
 
 автор: SHAman   (16.12.2007 в 01:48)   письмо автору
 
   для: afdm   (16.12.2007 в 00:21)
 

Тоже) В принципе, парсить xml - очень просто. Могу любую xml-ку распарсить за полчаса - максимум) И то, если лениться. Обычно это сводится к сочинению двух-трех регулярок, которые очень просты. Например, для RSS:


            <item>
            <title>Вызов ошибки 403</title>
            <link>http://softtime.ru/forum/readrss.php?id=47149_1</link>
            <description>Я еще делетан в PHP, и не раз для себя задавался проблемой вызова этой ошибки специально.
Вот собствено и все....</description> 
            <category>PHP</category>
            <pubDate>Sun, 16 Dec 2007 00:59:04 +0300</pubDate>
            <author>PAUELL</author>
        </item>


Если мне нжна тема и ссылка, то будет две регулярки и один цикл.

<title>(.*?)<\/title> и <link>(.*?)</link>

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

   
 
 автор: SHAman   (16.12.2007 в 02:03)   письмо автору
 
   для: SHAman   (16.12.2007 в 01:48)
 

Эх... все равно делать нечего) Давайте подумоем)
дано:

<FORECAST day="16" month="12" year="2007" hour="8" tod="1" predict="18" weekday="1">
  <PHENOMENA cloudiness="0" precipitation="10" rpower="0" spower="0" /> 
  <PRESSURE max="754" min="752" /> 
  <TEMPERATURE max="-2" min="-4" /> 
  <WIND min="3" max="6" direction="0" /> 
  <RELWET max="86" min="81" /> 
  <HEAT min="-4" max="-2" /> 
  </FORECAST>

Сначала, нужно, как я понимаю, разфигачить это на куски. предлагаю сделать это сплитом по '<FOREACAST'.

Дальше вытягиваем параметры (показываю один раз, потом - по образу и подобию) из FORECAST. Так как самого форекаста у нас нет, то продолжаем без головы
/day=(['"]?)(.*?)\$1.*?month=\$1(.*?)\$1.*?year=\$1(.*?)\$1 ну и так далее.*?>/i
В и тоге получаем массив значений: в нулевом элементе, вся строка, в первом - кавычка, либо пустота, дальше - день, дальше - месяц, дальше - год и т.д.

Например, парсим температуру:
/<TEMPERATURE max=(['"]?)(.*?)\$1 min=\$1(.*?)\$1.*?>/i
теперь на выходе опять будет:
0 - вся строка, 1 - кавычка, 2 - максимальная температура, 3 - минимальная.

Зачем я ловлю кавычку? Просто! Вместо (['"]?) мы можем написать просто ", но если мастерам придет в голову изменить шаблон и они поставят там не двойную, а одинарную кавычку, наша регулярка перестанет работать. Правда, мы теряем в скорости и памяти, но не много. Мы ловим кавычку и подставляем ее туда, где они стоят. Если не нравится, можно ставить просто " и не париться.

Надеюсь, понятно объяснил... Надо будет статью написать на эту тему...

   
 
 автор: afdm   (16.12.2007 в 02:08)   письмо автору
 
   для: SHAman   (16.12.2007 в 01:48)
 

Ну мне с Вами, SHAman рановато пока тягаться по рег. выражениям (читаю ваш блог регулярно в т.ч. и по регулярным выражениям :)
да просто у меня готовый класс (тут недавно тема была) есть для этого дела :) поэтому для меня это дело двух секунд :)))

   
 
 автор: SHAman   (16.12.2007 в 19:29)   письмо автору
 
   для: afdm   (16.12.2007 в 02:08)
 

Приятно встретить читателя) Я не гуру регулярок, если честно. Но пока не встречался с задачами, которые не мог бы решить. Если подкинешь - буду благодарен ;)

   
 
 автор: afdm   (16.12.2007 в 12:20)   письмо автору
163.5 Кб
 
   для: denya   (15.12.2007 в 16:53)
 

как и обещал...
Вот собственно. Хотя SHAman вроде бы уже всё разжевал :)))

   
 
 автор: denya   (16.12.2007 в 19:58)   письмо автору
 
   для: afdm   (16.12.2007 в 12:20)
 

А как его подключать?
Блин, нИпонятно!

P.S. SHAman...а ты статейку то напиши

   
 
 автор: SHAman   (16.12.2007 в 22:32)   письмо автору
 
   для: denya   (16.12.2007 в 19:58)
 

Создаем объект, вызываем метод query и все. Там же все навписано в самом классе!

   
 
 автор: denya   (17.12.2007 в 04:38)   письмо автору
 
   для: SHAman   (16.12.2007 в 22:32)
 

То есть я создаю файл «Weather.class.php», в него запихиваю всё от class Weather до последней скобки.
Потом создаю какой-нибудь файл weather.php, в него пишу

require_once('Weather.class.php');
$wthr = new Weather();
$wthr->query('москва');

И всё?
Если так, то у меня ругается:
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in Weather.class.php on line 8
Лайн 8 это

protected $towns = array(

Вам, программистам просто говорить: берёшь, создаёшь, вставляешь.
А если я не знаю синтаксиса...ну не всем быть программистами.

   
 
 автор: а-я   (04.01.2008 в 03:31)   письмо автору
 
   для: denya   (15.12.2007 в 16:53)
 

Можно остюда отолкнуться.... удали, что не нужно...

<?PHP
header
("Content-type: text/html; charset=UTF-8");
?>
<html>
 <head>
  <title>Погода</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 </head>
 <body>    
  <form action="./">Код города:
   <input type="text" name="id" value="<?=htmlspecialchars(@$_GET['id'])?>"/>
   <select name="tod" selected="">
    <option value=" " > </option>
    <option value="0"<?= @$_GET['tod']==0?'selected':''?>>утро</option>
    <option value="1"<?= @$_GET['tod']==1?'selected':''?>>день</option>
    <option value="2"<?= @$_GET['tod']==2?'selected':''?>>вечер</option>
    <option value="3"<?= @$_GET['tod']==3?'selected':''?>>ночь</option>
   </select>
   <input type="submit" value="Смотреть" />
  </form>
  <hr />
<?
    
if(!empty($_GET['id']))
    {
INFO_pogoda($_GET['id'],$_GET['tod']);}
?>
 </body>
</html>
<?
    
function INFO_pogoda($A,$B)
    {
    
$sxml simplexml_load_file('http://informer.gismeteo.ru/xml/'.$A.'.xml');
    
$TOWN $sxml->REPORT->TOWN->attributes();
    echo 
'<b>Информация о пункте прогнозирования:</b><br />';
    echo 
'ID: '.$TOWN->index.'<br />';
    echo 
'Город: '.iconv('windows-1251','UTF-8',urldecode($TOWN->sname)).'<br />';
    echo 
'Широта: '.$TOWN->latitude.'<br />';
    echo 
'Долгота: '.$TOWN->longitude.'<br />';
    echo 
'<hr />';
        if(
$B>=&& $B<4)
        {
        
$FORECAST $sxml->REPORT->TOWN->FORECAST;
        
INFO_tod($FORECAST[(int)$B]);
        }
        else
        {
            foreach(
$sxml->REPORT->TOWN->FORECAST as $FORECAST)
            {
INFO_tod($FORECAST);}
        }
    }

    function 
INFO_tod($FORECAST)
    {
    
$INFO $FORECAST->attributes();
    echo 
'<b>Информация о сроке прогнозирования:</b><br />';
    echo 
'Дата: '.$INFO->day.'-'.$INFO->month.'-'.$INFO->year.'<br />';
    
$NAME_tod = array('ночь','утро','день','вечер');
    echo 
'Время суток: '.$NAME_tod[(int)$INFO->tod].'<br />';
    
$NAME_weekday = array(0,'воскресенье','понедельник','вторник','среда','четверг','пятница','суббота');
    echo 
'День недели: '.$NAME_weekday[(int)$INFO->weekday].'<br />';
    echo 
'Местное время: '.$INFO->hour.'<br />';
    echo 
'заблаговременность прогноза в часах: '.$INFO->predict.'<br />';
    echo 
'<br />';

    
$PHENOMENA $FORECAST->PHENOMENA->attributes();
    echo 
'<b>Атмосферные явления:</b><br />';
    
$NAME_c_p = array('ясно','малооблачно','облачно','пасмурно','дождь','ливень',0,'снег','гроза','нет данных','без осадков');
    
$NAME_rpower = array('возможен дождь/снег','дождь/снег');
    
$NAME_spower = array('возможна гроза','гроза');    
    echo 
'облачность по градациям: '.$NAME_c_p[(int)$PHENOMENA->cloudiness].'<br />';
    echo 
'тип осадков: '.$NAME_c_p[(int)$PHENOMENA->precipitation].'<br />';
    echo 
'интенсивность осадков: '.$NAME_rpower[(int)$PHENOMENA->rpower].'<br />';
    echo 
'вероятность грозы: '.$NAME_spower[(int)$PHENOMENA->spower].'<br />';
    echo 
'<br />';

    
$PRESSURE $FORECAST->PRESSURE->attributes();
    echo 
'<b>Атмосферное давление, в мм.рт.ст.:</b><br />';
    echo 
'макс: '.$PRESSURE->max.'<br />';
    echo 
'мин: '.$PRESSURE->min.'<br />';
    echo 
'<br />';

    
$TEMPERATURE $FORECAST->TEMPERATURE->attributes();
    echo 
'<b>Температура воздуха, в градусах Цельсия:</b><br />';
    echo 
'макс: '.$TEMPERATURE->max.'<br />';
    echo 
'мин: '.$TEMPERATURE->min.'<br />';
    echo 
'<br />';

    
$WIND $FORECAST->WIND->attributes();
    echo 
'<b>Приземный ветер:</b><br />';
    echo 
'макс: '.$WIND->max.'<br />';
    echo 
'мин: '.$WIND->min.'<br />';
    
$NAME_direction = array('северный','северо-восточный','восточный','юго-восточный','южный','юго-западный','западный','северо-западный');
    echo 
'направление ветра в румбах: '.$NAME_direction[(int)$WIND->direction].'<br />';
    echo 
'<br />';

    
$RELWET $FORECAST->RELWET->attributes();
    echo 
'<b>Относительная влажность воздуха, в %:</b><br />';
    echo 
'макс: '.$RELWET->max.'<br />';
    echo 
'мин: '.$RELWET->min.'<br />';
    echo 
'<br />';

    
$HEAT $FORECAST->HEAT->attributes();
    echo 
'<b>Комфорт - температура воздуха по ощущению одетого по сезону человека, выходящего на улицу:</b><br />';
    echo 
'макс: '.$HEAT->max.'<br />';
    echo 
'мин: '.$HEAT->min.'<br />';
    echo 
'<hr />';
    }
?>

   
 
 автор: afdm   (04.01.2008 в 10:51)   письмо автору
 
   для: а-я   (04.01.2008 в 03:31)
 

да кстати, загляни в блог Шамана dayte2.com кажется... он статейку-то написал по этому поводу...

   
 
 автор: SHAman   (04.01.2008 в 15:52)   письмо автору
 
   для: afdm   (04.01.2008 в 10:51)
 

Написал. Только там я RSS парсю. XML торжественно обещал распарсить, но только никак руки не дойдут.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования