За последние 24 часа нас посетили 30537 программистов и 1795 роботов. Сейчас ищут 1209 программистов ...

выдергиваем значения из HTML в массив

Тема в разделе "PHP для новичков", создана пользователем incomer, 11 авг 2009.

  1. incomer

    incomer Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    49
    Симпатии:
    0
    Адрес:
    я знаю !?
    Добрый день/вечер.

    есть такой исходные данные:
    HTML:
    1.  
    2. <a href="...">Название 1-го фильма</a>
    3. <table class="border">
    4. <tr>
    5.     <td><b>жанр:</b><p>Название жанра</p></td>
    6.     <td><b>год:</b><p>дата</p></td>
    7. </tr>
    8. ... <!-- повторяющиеся блоки -->
    9.  
    Прошу помочь, совет как "выдернуть" значения из HTML в массив (примерно в такой):

    array
    (
    [1]["title"] => "Название 1-го фильма",
    [1]["genre"] => "Название жанра",
    [1]["date"] => "дата",

    [2]["title"] => "Название 2-го фильма",
    [2]["genre"] => "",
    [2]["date"] => "дата"
    ...
    );

    Посоветуете обратиться к регулярным выражениям или др. варианты?
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Регулярки с последующей обработкой индексов.
     
  3. incomer

    incomer Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    49
    Симпатии:
    0
    Адрес:
    я знаю !?
    Apple, спасибо за оперативный ответ.

    Предполагал воспользоваться функцией preg_match_all(), но от синтаксиса голова 2 день «кругом», попроще ничего нет?
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Это программирование, сын мой (с) =)
     
  5. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Есть, заплатить кому-нибудь бабла.
     
  6. incomer

    incomer Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    49
    Симпатии:
    0
    Адрес:
    я знаю !?
    Apple, можно и дипломатичнее было ответить, ведь в Вы сами мне в сыновья годитесь )), программирование лишь моё хобби.

    Hight, а если без коммерческого интереса, то мои предположения насчет функции preg_match_all() правильные?
    [/list]
     
  7. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    В этом я крайне сомневаюсь.

    Да, но одной ей не обойтись.
     
  8. incomer

    incomer Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    49
    Симпатии:
    0
    Адрес:
    я знаю !?
    не сомневайтесь и не муссируйте эту тему, пожалуйста.
    еще раз спасибо, подскажите ход/алгоритм не более.
     
  9. incomer

    incomer Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    49
    Симпатии:
    0
    Адрес:
    я знаю !?
    Вот как думаю обхитрить самого себя), т.е. разбить HTML на куски и все повторяющие заменить на «,», а далее применить функцию explode() – плохой вариант или посоветуете разобраться в регулярных выражениях?
     
  10. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Какова реальная структура данных?
    Повторяющиеся блоки идут упорядоченно с явно-выраженной последовательностью или разбросаны по коду в разных местах?
    Есть реальный пример расположения нужных данных в контексте?

    Если нет, то даже preg_split не применить без предварительного разбора "мусора".
     
  11. incomer

    incomer Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    49
    Симпатии:
    0
    Адрес:
    я знаю !?
    блоком я назвал тэги ссылки и таблицы, которые в реальности разделены тэгом <br> со строгой последовательностью (идентично приведенному примеру). Реальный код представляет около 500 строк – один «блок».

    Осознал необходимость посидеть над литературой, лучше обращусь повторно со своим решением на Ваш суд.
    Спасибо всем.
     
  12. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Вот мой код, который делает то, что нужно (ниже рабочий вариант).

    PHP:
    1. <?
    2.  
    3. // Результатирующий массив со ссылками
    4. $movies = array();
    5.  
    6.  
    7. // Получаем первичную информацию
    8. if(preg_match_all('/<a(?:.*?)>(.+?)<\/a>(?:[[:space:][:cntrl:]]*?)<table(?:.*?)>(.+?)<\/table>/si', $html, $main)) {
    9.    
    10.     // Так, теперь мы получили ссылки и жанры
    11.     for($i = 0; $i < count($main); $i++) {
    12.         $movies[$i]['title'] = $main[1][$i];
    13.        
    14.         // Непосредственно выдираем информацию
    15.         if(preg_match_all('/(?<=<p>)(.+?)(?=<\/p>)/s', $main[2][$i], $info)) {
    16.             $movies[$i]['genre'] = $info[1][0];
    17.             $movies[$i]['date']  = $info[1][1];
    18.         }
    19.     }
    20. }
    21.  
    22. ?>
    Рабочий (в смысле при разработке):

    PHP:
    1. <?php
    2.  
    3. $html = '<a href="...">Название 1-го фильма</a>
    4.         <table class="border">
    5.         <tr>
    6.         <td><b>жанр:</b><p>Комедия</p></td>
    7.         <td><b>год:</b><p>дата</p></td>
    8.         </tr>
    9.         </table>
    10.        
    11.         <a href="...">Название 2-го фильма</a>
    12.         <table class="border">
    13.         <tr>
    14.         <td><b>жанр:</b><p>Ужасы</p></td>
    15.         <td><b>год:</b><p>дата</p></td>
    16.         </tr>
    17.         </table>
    18.        
    19.         <a href="...">Название 3-го фильма</a>
    20.         <table class="border">
    21.         <tr>
    22.         <td><b>жанр:</b><p>Эротика</p></td>
    23.         <td><b>год:</b><p>дата</p></td>
    24.         </tr>
    25.         </table>';
    26.  
    27. // Результатирующий массив со ссылками
    28. $movies = array();
    29.  
    30.  
    31. // Получаем первичную информацию
    32. if(preg_match_all('/<a(?:.*?)>(.+?)<\/a>(?:[[:space:][:cntrl:]]*?)<table(?:.*?)>(.+?)<\/table>/si', $html, $main)) {
    33.    
    34.     // Так, теперь мы получили ссылки и жанры
    35.     for($i = 0; $i < count($main); $i++) {
    36.         $movies[$i]['title'] = $main[1][$i];
    37.        
    38.         // Непосредственно выдираем информацию
    39.         if(preg_match_all('/(?<=<p>)(.+?)(?=<\/p>)/s', $main[2][$i], $info)) {
    40.             $movies[$i]['genre'] = $info[1][0];
    41.             $movies[$i]['date']  = $info[1][1];
    42.         }
    43.     }
    44. }
    45.  
    46. print_r($movies);
    47.  
    48. ?>
    Разбирайтесь.
    Логика кода, полагаю, ясна.
     
  13. incomer

    incomer Активный пользователь

    С нами с:
    25 апр 2009
    Сообщения:
    49
    Симпатии:
    0
    Адрес:
    я знаю !?
    примите мою признательность за все Ваши ответы, за код отдельное СПАСИБО (искал подобное, но безуспешно). пусть в Вашей жизни удвоится моментов радости как у меня сегодня ).

    Всем спасибо, полагаю, тема закрыта, а я иду разбираться логике кода.