Добрый день/вечер. есть такой исходные данные: HTML: <a href="...">Название 1-го фильма</a> <table class="border"> <tr> <td><b>жанр:</b><p>Название жанра</p></td> <td><b>год:</b><p>дата</p></td> </tr> </table> ... <!-- повторяющиеся блоки --> Прошу помочь, совет как "выдернуть" значения из HTML в массив (примерно в такой): array ( [1]["title"] => "Название 1-го фильма", [1]["genre"] => "Название жанра", [1]["date"] => "дата", [2]["title"] => "Название 2-го фильма", [2]["genre"] => "", [2]["date"] => "дата" ... ); Посоветуете обратиться к регулярным выражениям или др. варианты?
Apple, спасибо за оперативный ответ. Предполагал воспользоваться функцией preg_match_all(), но от синтаксиса голова 2 день «кругом», попроще ничего нет?
Apple, можно и дипломатичнее было ответить, ведь в Вы сами мне в сыновья годитесь )), программирование лишь моё хобби. Hight, а если без коммерческого интереса, то мои предположения насчет функции preg_match_all() правильные? [/list]
не сомневайтесь и не муссируйте эту тему, пожалуйста. еще раз спасибо, подскажите ход/алгоритм не более.
Вот как думаю обхитрить самого себя), т.е. разбить HTML на куски и все повторяющие заменить на «,», а далее применить функцию explode() – плохой вариант или посоветуете разобраться в регулярных выражениях?
Какова реальная структура данных? Повторяющиеся блоки идут упорядоченно с явно-выраженной последовательностью или разбросаны по коду в разных местах? Есть реальный пример расположения нужных данных в контексте? Если нет, то даже preg_split не применить без предварительного разбора "мусора".
блоком я назвал тэги ссылки и таблицы, которые в реальности разделены тэгом <br> со строгой последовательностью (идентично приведенному примеру). Реальный код представляет около 500 строк – один «блок». Осознал необходимость посидеть над литературой, лучше обращусь повторно со своим решением на Ваш суд. Спасибо всем.
Вот мой код, который делает то, что нужно (ниже рабочий вариант). PHP: <? // Результатирующий массив со ссылками $movies = array(); // Получаем первичную информацию if(preg_match_all('/<a(?:.*?)>(.+?)<\/a>(?:[[:space:][:cntrl:]]*?)<table(?:.*?)>(.+?)<\/table>/si', $html, $main)) { // Так, теперь мы получили ссылки и жанры for($i = 0; $i < count($main); $i++) { $movies[$i]['title'] = $main[1][$i]; // Непосредственно выдираем информацию if(preg_match_all('/(?<=<p>)(.+?)(?=<\/p>)/s', $main[2][$i], $info)) { $movies[$i]['genre'] = $info[1][0]; $movies[$i]['date'] = $info[1][1]; } } } ?> Рабочий (в смысле при разработке): PHP: <?php $html = '<a href="...">Название 1-го фильма</a> <table class="border"> <tr> <td><b>жанр:</b><p>Комедия</p></td> <td><b>год:</b><p>дата</p></td> </tr> </table> <a href="...">Название 2-го фильма</a> <table class="border"> <tr> <td><b>жанр:</b><p>Ужасы</p></td> <td><b>год:</b><p>дата</p></td> </tr> </table> <a href="...">Название 3-го фильма</a> <table class="border"> <tr> <td><b>жанр:</b><p>Эротика</p></td> <td><b>год:</b><p>дата</p></td> </tr> </table>'; // Результатирующий массив со ссылками $movies = array(); // Получаем первичную информацию if(preg_match_all('/<a(?:.*?)>(.+?)<\/a>(?:[[:space:][:cntrl:]]*?)<table(?:.*?)>(.+?)<\/table>/si', $html, $main)) { // Так, теперь мы получили ссылки и жанры for($i = 0; $i < count($main); $i++) { $movies[$i]['title'] = $main[1][$i]; // Непосредственно выдираем информацию if(preg_match_all('/(?<=<p>)(.+?)(?=<\/p>)/s', $main[2][$i], $info)) { $movies[$i]['genre'] = $info[1][0]; $movies[$i]['date'] = $info[1][1]; } } } print_r($movies); ?> Разбирайтесь. Логика кода, полагаю, ясна.
примите мою признательность за все Ваши ответы, за код отдельное СПАСИБО (искал подобное, но безуспешно). пусть в Вашей жизни удвоится моментов радости как у меня сегодня ). Всем спасибо, полагаю, тема закрыта, а я иду разбираться логике кода.