| Парсинг страницы на PHPПоследнее время мне очень часто приходится парсить страницы разных сайтов. Когда я начинал изучать эту тему, то заметил, что есть 2 подхода к анализу контента страницы: анализ регулярными выражениями и с помощью phpQuery. Будучи не сторонником использования чужих библиотек я выбрал 1ый путь.
Разбираемся в регулярках
Начнем с описания синтаксиса регулярных выражений.
Разберем простейший шаблон:
<(h1|h2|h3)><a href=”(.*?)”>(.*?)</a></(h1|h2|h3)>
( ) является подшаблоном знак | означает или, то есть подшаблон (h1|h2|h3) означает вхождение или h1, или h2, или h3. Точка в подшаблоне (.*?) обозначает любой символ. * - неограниченное количество совпадений. А ? оптимизирует и минимизирует, но об этом позже. Кроме того в preg_match этот подшаблон отвечает за искомый фрагмент текста.
В регулярных выражениях существует еще и другой тип шаблонов: #шаблон#
#a|z# означает вхождение a или z. Совпадает в строках: Abraham J. Simpson go to the zoo
и не совпадает в строке
Home sweet home (нет ни a, ни z)
#ˆa# - символ находится в начале строки #т$# - символ находится в конце строки
Можно также указать количество совпадений. { } - эти знаки в шаблоне обозначают сколько раз должно быть совпадение + тоже самое, что и {1, } - один или более раз
первая цифра-минимальное количество совпадений, вторая — максимальное(если её нет, то бесконечное количество).
Кроме этого, классы символов можно обозначать так: точка. — любой символ(. - только точка).
Модификаторы: ставятся после шаблона, например #шаблон#i
i - игнорировать регистр Регулярные выражения в действии
И так, немного разобравшись в теории, преступим к практике.
Решим легонькую задачку - найти все ссылки на странице:
Основой кода является выражение "/<a[[:print:]]href=["|'](.*?)["|'].*?>(.*?)<.{0,1}a.{0,1}>/i" давайте разберем его:
первым делом ищем тег ссылки: <a[[:print:]]href=["|'](.*?)["|'].*?> нам нужен только url, но к сожалению обойтись выражением типа <a href=”(.*?)”> не удастся. Во-первых в теге могут присутствовать разного рода включения(типа style или onclick), от них избавляемся шаблоном [[:print:]], а во-вторых неизвестно какие кавычки будут ограничивать адрес(используем шаблон ["|']-или " или '). Текст ссылки берем шаблоном (.*?), а на закрывающий тег натравливаем <.{0,1}a.{0,1}> так как не знаем куда вебмастер поставит символ /. Естественно необходимо применить модификатор i чтоб не думать о регистре.
Думаю теперь вам под силу отпарисить любую страницу, если возникнут трудности, пишите, помогу. Создан Administrator(2010-07-05 12:37:18) |
|
|||||
Copyright Alexander Semion(Spin7ion)© | |||||||