Представьте такую парсилку:
1. Сначала разобрать HTML-документ на линейную последовательность тегов. Тег - имя + набор атрибутов. Иерархии нет. Закрывающий тег - тупо отдельное имя в той же плоской последовательности.
2. Рассмотреть всю эту последовательность как строку символов, где символ - тег.
3. Сделать regexp-машинку, которая оперирует не символами текста, а тегами. В таком духе:
// заматчить любую пару тегов <TD> + </TD> с любыми тегами между ними.
TD, * *, /TD
// то же самое, но только <TD> имеющий атрибут "hello" равный 123
TD hello=="123", * *, /TD
// можно замутить встроенный язык с переменными
// При встрече тега HTML создать i = 0
// Пропустить сколько угодно каких угодно тегов
// заматчить много последовательностей <TD> ... </TD>
// При матчинге очередного TD инкрементнуть переменную
// В итоге мы посчитаем число пар <TD>...</TD> заодно.
HTML $i=0, * *, (TD $i++, * *, /TD)*
Не будет ли такое быстрее, чем построение в памяти всего DOM-дерева и исполнение на этом дереве XPath-запросов?