Я пытаюсь проанализировать приведенную здесь таблицу в многомерном массиве php. Я использую следующий код, но по какой-то причине возвращает пустой массив. После поиска в Интернете я нашел этот сайт, на котором я получил функцию parseTable (). От чтения комментариев на этом веб-сайте я вижу, что функция работает отлично. Поэтому я предполагаю, что что-то не так с тем, как я получаю HTML-код от file_get_contents (). Любые мысли о том, что я делаю неправильно?
<?php $data = file_get_contents('http://flow935.com/playlist/flowhis.HTM'); function parseTable($html) { // Find the table preg_match("/<table.*?>.*?<\/[\s]*table>/s", $html, $table_html); // Get title for each row preg_match_all("/<th.*?>(.*?)<\/[\s]*th>/", $table_html[0], $matches); $row_headers = $matches[1]; // Iterate each row preg_match_all("/<tr.*?>(.*?)<\/[\s]*tr>/s", $table_html[0], $matches); $table = array(); foreach($matches[1] as $row_html) { preg_match_all("/<td.*?>(.*?)<\/[\s]*td>/", $row_html, $td_matches); $row = array(); for($i=0; $i<count($td_matches[1]); $i++) { $td = strip_tags(html_entity_decode($td_matches[1][$i])); $row[$row_headers[$i]] = $td; } if(count($row) > 0) $table[] = $row; } return $table; } $output = parseTable($data); print_r($output); ?>
Я хочу, чтобы мой выходной массив выглядел примерно так:
1 -> 11:33 AM -> DEV -> В ТЕМНОМ 2 -> 11:29 AM -> LIL 'WAYNE -> ОНА БУДЕТ 3 -> 11:26 AM -> КАРДИНАЛЬНЫЙ ОФИШАЛЬ -> NUMBA 1 (TIDE HIGH)
Не калечите себя синтаксический анализ HTML с помощью регулярных выражений! Вместо этого пусть библиотека парсеров HTML беспокоится о структуре разметки для вас.
Я предлагаю вам проверить Simple HTML DOM ( http://simplehtmldom.sourceforge.net/ ). Это библиотека, специально написанная для помощи в решении таких проблем с веб-соскабливанием в PHP. Используя такую библиотеку, вы можете писать свои скребки в гораздо меньших количествах кодов, не беспокоясь о создании рабочих регулярных выражений.
В принципе, с помощью Simple HTML DOM вы просто пишете что-то вроде:
$html = file_get_html('http://flow935.com/playlist/flowhis.HTM'); foreach($html->find('tr') as $row) { // Parse table row here }
Затем это может быть расширено для захвата ваших данных в некотором формате, например, для создания массива художников и соответствующих названий:
<?php require('simple_html_dom.php'); $table = array(); $html = file_get_html('http://flow935.com/playlist/flowhis.HTM'); foreach($html->find('tr') as $row) { $time = $row->find('td',0)->plaintext; $artist = $row->find('td',1)->plaintext; $title = $row->find('td',2)->plaintext; $table[$artist][$title] = true; } echo '<pre>'; print_r($table); echo '</pre>'; ?>
Мы можем видеть, что этот код может быть (тривиально) изменен для переформатирования данных любым другим способом.
Я попробовал simple_html_dom, но в больших файлах и повторных вызовах функции, которую я получаю zend_mm_heap_corrupted на php 5.3 (GAH). Я также попробовал preg_match_all (но это было неудачно в больших файлах (5000) строк html, который составлял всего около 400 строк моей таблицы HTML.
Я использую это и его быстродействие, а не ошибки.
$dom = new DOMDocument(); //load the html $html = $dom->loadHTMLFile("htmltable.html"); //discard white space $dom->preserveWhiteSpace = false; //the table by its tag name $tables = $dom->getElementsByTagName('table'); //get all rows from the table $rows = $tables->item(0)->getElementsByTagName('tr'); // get each column by tag name $cols = $rows->item(0)->getElementsByTagName('th'); $row_headers = NULL; foreach ($cols as $node) { //print $node->nodeValue."\n"; $row_headers[] = $node->nodeValue; } $table = array(); //get all rows from the table $rows = $tables->item(0)->getElementsByTagName('tr'); foreach ($rows as $row) { // get each column by tag name $cols = $row->getElementsByTagName('td'); $row = array(); $i=0; foreach ($cols as $node) { # code... //print $node->nodeValue."\n"; if($row_headers==NULL) $row[] = $node->nodeValue; else $row[$row_headers[$i]] = $node->nodeValue; $i++; } $table[] = $row; } var_dump($table);
Этот код работал хорошо для меня. Пример исходного кода здесь.
http://techgossipz.blogspot.co.nz/2010/02/how-to-parse-html-using-dom-with-php.html