Принцип парсинга опр. структуры вывода

Тема в разделе "PHP", создана пользователем yeaahhh, 3 мар 2011.

Модераторы: latteo
  1. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Ребят, подскажите, пожалуйста, как разбить вывод на нужную структуру.
    Парсю тв-программу с http://www.soccer.ru/tv/ через file_get_content.

    получил вывод в цикле нужной информации. Но:
    Даты всего 4. А событий намного больше. Каким способом можно прикрепить к дате нужное кол-во событий?
    Заранее большое спасибо!
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.404
    Симпатии:
    1.185
    Ну вот решение вообще в лоб:
    PHP:
    $storinka file_get_contents('tv.htm');

    echo 
    "Парсинг \r\n";
    $reg "/<tr bgcolor=#f3f3f3><td><b>(.*)<\/b><\/td><td>(.*)<\/td>/iU"
    $res_status preg_match_all ($reg$storinka$res_array);
    if (!
    $res_status) echo "Возникли ошибки при выполнении поиска совпадений preg_match\r\n";
    elseif(
    $res_status == 0) echo "Не найдено совпадений - 0 match\r\n";
    else {
        echo 
    "Найдено $res_status совпадений\r\n";
            
    print_r ($res_array); //DEV
    }
    Для тех, у которых оранжевым выделено время, регулярку придумай сам :)
     
  3. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    latteo, не понял вашего решения проблемы..
    Мне необходимо сделать привязку даты к группе событий.. но не знаю, как этого сделать..
    Чтобы было так:
    Дата1
    ---
    события к дате 1

    Дата2
    -------
    события к дате 2

    и т.д.

    Вот код парсера:
    PHP:
    set_time_limit(0);
    $input=file_get_contents('http://www.soccer.ru/tv/');

    $input=iconv("utf-8""cp1251"$input);

    preg_match_all("|<img src=.* border=0 style='padding:3' align=absmiddle></a> <b>(.*)</td>|sUS"$input$channels);
    preg_match_all('|class="greenheader"><td colspan=3> (.*)</td><tr>|sUS'$input$date);

    $k=count($channels[1]);
    for(
    $i=0;$i<$k$i++)
    {
    echo 
    $date[1][$i];
    echo 
    '<br />';
    echo 
    $channels[1][$i];
    echo 
    '<br />';
    }
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.404
    Симпатии:
    1.185
    Так?
    PHP:
    <?
    set_time_limit(0);

    $input=file_get_contents('http://www.soccer.ru/tv/');

    $input=iconv("utf-8""cp1251"$input);

    echo 
    "Парсинг \r\n";
    $reg "/<tr bgcolor=#f3f3f3><td><b>(.*)<\/b><\/td><td>(.*)<\/td>/iU"
    $res_status preg_match_all ($reg$input$res_array);
    if (!
    $res_status) echo "Возникли ошибки при выполнении поиска совпадений preg_match\r\n";
    elseif(
    $res_status == 0) echo "Не найдено совпадений - 0 match\r\n";
    else {
        echo 
    "Найдено $res_status совпадений\r\n";
            
    //print_r ($res_array); //DEV
    }
    $k=count($res_array[0]);
    for(
    $i=0;$i<$k$i++)
    {
        echo 
    $res_array[1][$i];
        echo 
    '<br />';
        echo 
    $res_array[2][$i];
        echo 
    '<br />';



    ?>
     
  5. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    С эти у меня проблем нет..
    Мне нужно дату выставить в нужное место. чтобы всё было в порядке. а не так как сейчас, всё идёт друг за другом.. понимаете..?)

    т.е.:
    ------------

    03.03.11
    Все события к этой дате

    04.03.11
    Все события к этой дате

    05.03.11
    Все события к этой дате

    А сейчас:
    ----------
    03.03.11
    Одно событие к 03.03.11

    04.03.11
    Одно событие к 03.03.11

    05.03.11
    Одно событие к 03.03.11

    Т.е. нужно как-то правильную структуру сделать..
     
  6. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    выдирай сначало даты и программы вместе и потом уже только их распарсивай отдельно
    PHP:
    <?php
    set_time_limit
    (0);
    $input=file_get_contents('http://www.soccer.ru/tv/');

    $input=iconv("utf-8""cp1251"$input);
    preg_match_all('|class="greenheader"><td colspan=3> (.*)<tr  bgcolor=56B945|sUS'$input$data);
    $count=count($data[0]);
    for(
    $ii=0;$ii<$count;$ii++){
    preg_match_all("|<img src=.* border=0 style='padding:3' align=absmiddle></a> <b>(.*)</td>|sUS"$data[0][$ii], $channels);
    preg_match_all('|class="greenheader"><td colspan=3> (.*)</td><tr>|sUS'$data[0][$ii], $date);
    //print_r($data);

    $k=count($channels[1]);
    for(
    $i=0;$i<$k$i++)
    {
    echo 
    $date[1][$i];
    echo 
    '<br />';
    echo 
    $channels[1][$i];
    echo 
    '<br />';
    }  }
    ?>
     
  7. VandJ

    VandJ

    Регистр.:
    8 апр 2008
    Сообщения:
    318
    Симпатии:
    113
    Можно так
    PHP:
    <?
    set_time_limit(0); 
    $input=file_get_contents('http://www.soccer.ru/tv/'); 
    $input=iconv("utf-8""cp1251"$input);
    function 
    sport($matches) {
      echo 
    $matches[1].'<br />'
    preg_match_all ("#align=absmiddle></a> <b>(.*?)</td>#"$matches[2], $channels);
     for(
    $i=0;$i<count($channels[1]); $i++){
     echo 
    $channels[1][$i].'<br />';
     }}
    preg_replace_callback ("#class=\"greenheader\"><td colspan=3> (.*?)</td>(.*?)(?:<tr  bgcolor=56B945|</table><br>)#""sport"$input);
    ?>
     
  8. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Многомерные массивы тебя спасут:

    PHP:
    $arr['2011-01-01'][] = "Событие1";
    $arr['2011-01-01'][] = "Событие2";
    $arr['2011-01-02'][] = "Событие3";
    $arr['2011-01-02'][] = "Событие4";
    $arr['2011-01-03'][] = "Событие5";
    var_dump($arr);
    Когда парсишь свои даты - собирай их вот в такой вот массивчик, а потом уже выводи.