Парсинг PHP: Функция file_get_contents — PROG-TIME

Парсинг PHP: Функция file_get_contents

06.01.2019
Содержание:

В прошлом уроке, мы уже знакомились с этой функцией, сейчас мы будем рассматривать ее подробнее.

file_get_contents — Читает содержимое файла в строку

Для того чтобы спарсить данные с помощью этой функции, нужно просто передать ей в качестве параметра ссылку. После чего вывести эту информацию любой функцией вывода(echo, print_r, var_dump).

Для примера возьмем главную страницу нашего сайта — http://prog-time.ru

$my_site = file_get_contents('http://prog-time.ru'); //записываем информацию в переменную
echo $my_site ; //выводим

Таким методом мы получаем всю страницу. Но что делать если нам нужна не вся страница, а какая то её часть, например заголовок?

Для этого можно использовать регулярные выражения.

Парсинг с помощью регулярок

Регулярные выражения используются для обрезании строки по определенному шаблону.

Так как вся полученная информация является одной большой строкой, мы можем обрезать ее часть и сохранить нужный нам HTML код.

Для этого можно использовать такой вид регулярного выражения — #<title>(.+?)</title>#su.

Первая и последняя #указывает начало и конец регулярного выражения. Между ними пишется тег, который нужно забрать, в моем случае это title.

$my_site = file_get_contents('http://prog-time.ru');//получаем информацию и записываем ее в переменную
preg_match_all('#<title>(.+?)</title>#su', $my_site, $res);//вырезаем нужную часть
var_dump($res);//выводим на экран

preg_match_allпервым параметром получает регулярное выражение, вторым строку(или имя переменной, которая хранит в себе строку), а последним — имя переменной, в которую нужно записать полученный результат.

Данный код должен вывести на экран массив со строкой содержимого тега title.

Не смотря на то что мы смогли добиться нужного результата, мы можем улучшить наш код.

Дело в том, что представленный выше код, может проверять только теги которые не имеют атрибутов. Но что если нам нужны теги которые могут иметь атрибуты.

Для этого нам поможет вот эта регулярка — #<title .*>(.+?)</title>#su

Это регулярное выражение найдет указанный тег, если у него есть атрибуты или если их у него нет.

Это все выглядит отлично, но что если нужно получить тег по определенному значению выбранного атрибута. Например нам нужно получить тег div у которого атрибут class = test.

Для этого будем использовать вот это регулярное выражение —
#<div\class="test">(.+?)</div>#su .

Ну все, теперь точно идеально…если не учитывать пробелы! Да, могут же быть пробелы. Например так <div class="test" ></div> или так <div class="test" ></div> .

Если будут пробелы, то наше регулярное выражение не подойдет. Надо исправить!

Вот! — #<div\s+?id\s*?=\s*?"content"\s*?>(.+?)</div>#su

\s — допускает присутствие пробелов

С пробелами мы разобрались,а что если у тега будут еще и другие атрибуты? Для решения такой задачи, нужно указать что перед и после нашего атрибута могу быть другие атрибуты.

#<div[^>]+?id\s*?=\s*?"content"[^>]*?>(.+?)</div>#su

Вот такая конструкция подойдет.

Ну а что нам теперь делать с кавычками? Ведь для записи значения атрибуту могут использовать как одинарные, так и двойные кавычки.

Вот окончательный вариант регулярного выражения — #<div[^>]+?id\s*?=\s*?["\']content["\'][^>]*?>(.+?)</div>#su

Окончательный вариант кода будет выглядеть так:

$my_site = file_get_contents('http://prog-time.ru');
preg_match_all('#<div[^>]+?id\s*?=\s*?["\']test["\'][^>]*?>(.+?)</div>#su',$my_site, $res);
var_dump($res);

Конечно мы добились желаемого результата, но наша регулярка не подойдет для тегов которые имеют вложенные теги, так как когда функция дойдет до первого закрывающегося тега она обрежет строку.

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