Недавно мне потребовалось сделать небольшой парсер на php для интернет-магазина. Я не стал изобретать велосипед и взял стандартную библиотеку. Но тут наткнулся на неожиданную проблему — библиотека парсит только правильно сверстанные сайты. Мой таким не был. Выходом из этой проблемы оказалось использование ещё более громоздких библиотек в которых сам черт ногу сломит. Я бросил это дело и решил парсить обычными регулярными выражениями. Всё шло хорошо когда парсились простые строки вроде цены и заголовков, но как дело дошло до средних размеров текста в котором встречаются теги br, stong и другие появились сложности.
Заголовок и цены я парсил выражением /тег([^<]*)/im Но текст не строка — в нём могут быть тоже теги, причем какие я точно знать не могу. Можно конечно напрячься и создать всеописывающие выражение — но я сделал всё проще.
Нужный текст для парсиринга был заключен в теги <td></td>
. С помощью функции explode('<td>',$html)
я раздел страницу на две части. Далее нижнюю часть страницы я опять разделял на две части — explode('</td>',$html_down)
и уже брал верхнюю часть. В итоге я получаю то что хотел — текст заключенный в теги <td>
и </td>
.
Вот код целиком:
$res = explode('<td>',$html,2);<br>
$res = explode('</td>',$res[1],2);<br>
$res = $res[0];
Здесь $html — это исходная страница в которой нужно искать что-то, а $res — результат поиска.
Конечно это не идеально и не всякую страницу можно вот так распарисить.
Но если можно почему бы и нет?
P.S. Я не изобрел что-то новое — уверен кто-то до меня это уже использовал. Просто хотелось поделиться с вами своими мыслями.
Автор: Murloc