Парсинг сложного html - DOM или RegExp?

Sparrow

Новичок
Парсинг сложного html - DOM или RegExp?

Вопрос отчасти теоретический, но все же задам здесь.

Миграция сайта

Постановка задачи: есть очень большой объем документов в html. Их нужно преобразовать следующим образом:

1. заменить шапку и концовку
2. заменить кучу внутренних ссылок по достаточно сложной схеме (Имеющиеся ссылки имеют вид href="/index.php?cat1=xxxx&cat2=yyyy", нужно преобразовать их в ЧПУ, при этом уже есть база соответствий (xxxx,yyyy => url)).

Особенности: html довольно рыхлый, классов и id там практически нет, трудно за что-то зацепиться. Кроме того могут быть незакрытые теги, кавычки, и.т.п. Объем каждого документа - примерно 45-64 kB, из которых от половины до 2/3 занимает всякий html-мусор (избыточные теги и прочие издержки кривого визуального редактора).

Платформа - Apache/php/mysql, есть рутовый доступ. Планируется запустить процесс достаточно надолго.

Теперь собственно вопрос: какой механизм посоветуете использовать для собственно парсинга html: XML (DOM, XML parser, etc.) или регулярные выражения?

Сделать все это ручками не предлагать - там десятки мегабайт контента.
 

sad

Новичок
Сначала действительно tidy.
Я вот не знаю, выдаст ли tidy xml well formed... если выдаст, то действительно - хорошо подойдет обработка его как xml, а если нет, то он загнется на первом незакрытом тэге или, например, <br>.
Если не выдаст, то разумеется регекспы (как вариант можно и свой парсер написать, ищущий урлы).
 

crocodile2u

http://vbolshov.org.ru
class DOMDocument ...

bool loadHTML ( string source )

The function parses the HTML contained in the string source. Unlike loading XML, HTML does not have to be well-formed to load. This function may also be called statically to load and create a DOMDocument object. The static invocation may be used when no DOMDocument properties need to be set prior to loading.

Может, подойдет?
 

Sparrow

Новичок
Похоже на то, что подойдет.
Однако на php.net написано "No version info". в 4.4.x оно есть?
 

Alexandre

PHPПенсионер
у меня была аналогичная проблема, надо было распарсить 1000 статических страниц и занести их в БД. Долго думали и считали, и пришли к выводу, что проще посадить обезьяну, которая делала копи-пасте.

с сылками немного посложнее... так как ссылки были только внутренние, то в БД каждая страница заносилась с ее ури, а потом ссылки парсилисть и заменялись на иди БД.

с картинками было так: старые -оставили как есть, а новые добавлялись через ЦМС

-~{}~ 19.04.06 11:22:

один из вариантов был ручное раставление тегов на часть контента<begin><end>, но потом пришли к выводу - что простое копи пасте - это по времени вйдет столькоже.

PS. надо отметить что кроме хидеров и футеров на сайте есть еще и менюшки и голосовалки и прочая обертка, которая по мимо контента заключена в <body>.
 
Сверху