Delphi6
BANNED | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Brodyaga А у меня это не работает: <?php $content = implode('', file("test.htm")); preg_match_all("#<table.*?>(.*?)</table>?#is", $content, $tables); print_r($tables[0]); ?> в чем проблемы? Проверьте может вы что-то не дописали? Cheery Вот код который я поправил и вот что он выдает: Код: <?php $content = implode('', file("test.htm")); preg_match_all("#<table(.*?)>(.*?)</table>#is", $content, $tables); foreach ($tables[2] as $key=>$value) { echo "Table #$key<br>\r\n<table {$tables[1][$key]}>".$tables[2][$key]."</table>\r\n<hr>\r\n"; } $content = '<td>value1<td>value2<td>value3<td>value4<td>'; preg_match_all("#<td>(.*?)<td>#is", $content, $values); print_r($values[1]); ?> | http://proxy-list.org/ru-board/table/test.php Все равно он почему-то он игнорирует внутреннюю таблицу! Я пофиксил сам HTML код что бы исключить вариант что ошибку он создает. Прошу обратить внимание ваше на второй пример, думаю он как-то намекает в чем проблема. Результат как мы думаем должен быть value1, value2, value3 и value4 но на самом деле только value1 и value3 получается, если регулярное выражение захватило некую часть (нашла совпадение), она ее игнорирует в дальнейшем поиске. Разве не тоже самое происходит с таблицей? Она находит первую и игнорирует таблицу которую первая содержит! Но как теперь решить эту проблему? Помница у рег. выражений был модификатор указывающий на рекурсивный (повторный) поиск. Добавлено: Если подумать логически то результат таким и должен быть (конечно мы хотим иной), ибо можно догадаться как приблизительно работает алгоритм рег. выражения, он ищет определенное совпадение с начала строки, и после того как найдет его продолжает поиск уже в оставшейся части. Реально он должен сдвигаться всего на один символ и начинать поиск заново, но это наверно не учли, и если так делать то мы проигрываем в скорости! Внизу красным и зеленым я выделил те td тэги которые в паре: Цитата: <td>value1<td>value2<td>value3<td>value4<td> | Так как при поиске было заюзано <td>value1<td> соответственно третий <td> в списке уже не участвует в поиске! Теперь вопрос, уважаемые знатоки как этого избежать? Добавлено: А вот доказательства моим словам: Код: $content = '<td>value1<td>value2<td>value3<td>value4<td>'; preg_match_all("#td>(.*?)<#is", $content, $values); print_r($values[1]); | К сожалению таким решением в лоб выше указанную проблему не обойдеш | Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 23:36 08-09-2006 | Исправлено: Delphi6, 01:28 09-09-2006 |
|