Обработка информации средствами PHP: парсинг и анализ

Раздел: PHP -> обработка данных

Основные подходы к парсингу в PHP

Наиболее эффективное решение: использование встроенных функций PHP

Для разбора данных в стандартизированных форматах (URL, INI-файлы, строки запроса, JSON, XML) в PHP существуют специализированные функции. Они оптимизированы и не требуют ручного написания парсеров. Примеры:

  • parse_url() - разбор URL на компоненты;
  • parse_ini_file() - чтение INI-файлов в массив;
  • parse_str() - разбор строки запроса;
  • json_decode() - декодирование JSON в объект/массив;
  • simplexml_load_string() - загрузка XML в объект.

Эти функции покрывают 80% типовых задач парсинга. Применяются, когда данные имеют чёткую структуру: URL из логов, конфигурации в INI, ответы API в JSON, веб-сервисы с XML.


$url = 'https://example.com/path?name=John&age=30';
$parts = parse_url($url);
parse_str($parts['query'], $query);
echo $query['name']; // John
    

Php function parse (парсинг в php)

Типичная проблема:

Функция parse_url() не валидирует URL, а только разбирает строку. Если передать некорректный URL, она может вернуть false или неполный массив. Решение - предварительная проверка через filter_var($url, FILTER_VALIDATE_URL).

Как разобрать данные из CSV-файла?

Используйте fgetcsv() для построчного чтения CSV с автоматическим учетом разделителей и кавычек.


$handle = fopen('data.csv', 'r');
while (($row = fgetcsv($handle, 1000, ',')) !== false) {
    print_r($row);
}
fclose($handle);
    

Result array php (массив результатов php)

Ошибка: некорректная обработка BOM (Byte Order Mark) в UTF-8 файлах. Решение - перед чтением применить fread() и удалить BOM, или использовать fgetcsv() с явной установкой локали.

Как извлечь данные из HTML-страницы?

DOMDocument и DOMXPath позволяют выполнять запросы к HTML-документу как к дереву узлов.


$html = file_get_contents('page.html');
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//div[@class="content"]/p');
foreach ($nodes as $node) {
    echo $node->nodeValue;
}
    

Проблема: HTML может содержать ошибки (незакрытые теги). Включение libxml_use_internal_errors(true) подавляет предупреждения. Для сложных селекторов лучше использовать библиотеку DOMCrawler (Symfony).

Как разобрать строку с известным шаблоном?

Функция sscanf() извлекает данные из строки по формату, аналогичному printf. Подходит для логов или сериализованных данных.


$log = '2025-01-15 10:20:30 ERROR: File not found';
$result = sscanf($log, '%4d-%2d-%2d %2d:%2d:%2d %s: %[^\n]', $y, $m, $d, $h, $i, $s, $level, $msg);
echo "Дата: $y-$m-$d, Уровень: $level, Сообщение: $msg";
    

Ошибка: неверное количество переменных или несовпадение формата. sscanf() возвращает количество сопоставленных полей, на которое можно проверить результат.

Как извлечь данные из неструктурированного текста с помощью регулярных выражений?

Функции preg_match() и preg_match_all() с шаблонами позволяют выбирать нужные фрагменты.


$text = 'Цена: 1500 рублей, скидка 10%';
preg_match('/Цена:\s*(?P<price>\d+)/', $text, $matches);
echo $matches['price']; // 1500
    

Типичная ошибка: забывают экранировать специальные символы или не используют модификаторы (u для UTF-8). Рекомендуется тестировать регулярные выражения на regex101.com.

Расширенные примеры парсинга

1. Парсинг JSON из API с помощью cURL и json_decode

Пример

$ch = curl_init('https://api.example.com/users/1');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: application/json']);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    echo 'Ошибка декодирования JSON: ' . json_last_error_msg();
} else {
    echo 'Имя: ' . $data['name'];
}
Имя: John Doe

2. Разбор CSV с разделителем точка с запятой и кавычками

Пример

$csv = '"Имя";"Возраст";"Город"
"Анна";"25";"Москва"
"Пётр";"30";"Санкт-Петербург"';
$lines = explode("\n", $csv);
$header = str_getcsv(array_shift($lines), ';', '"');
$data = [];
foreach ($lines as $line) {
    $row = str_getcsv($line, ';', '"');
    $data[] = array_combine($header, $row);
}
print_r($data);
Array
(
    [0] => Array
        (
            [Имя] => Анна
            [Возраст] => 25
            [Город] => Москва
        )
    [1] => Array
        (
            [Имя] => Пётр
            [Возраст] => 30
            [Город] => Санкт-Петербург
        )
)

3. Извлечение всех ссылок из HTML с помощью DOMXPath

Пример

$html = '<a href="/page1">Ссылка 1</a><a href="/page2" class="ext">Внешняя</a>';
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$links = $xpath->query('//a/@href');
foreach ($links as $link) {
    echo $link->nodeValue . "\n";
}
/page1
/page2

4. Использование sscanf для разбора строки с несколькими значениями

Пример

$string = 'Product: Laptop, Price: 45000, Quantity: 3';
$count = sscanf($string, 'Product: %[^,], Price: %d, Quantity: %d', $product, $price, $qty);
if ($count === 3) {
    echo "Товар: $product, Цена: $price руб., Количество: $qty";
} else {
    echo 'Не удалось разобрать строку';
}
Товар: Laptop, Цена: 45000 руб., Количество: 3

5. Извлечение электронных писем из текста с помощью preg_match_all

Пример

$text = 'Контакты: user@example.com, support@site.org, admin';
preg_match_all('/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/', $text, $emails);
print_r($emails[0]);
Array
(
    [0] => user@example.com
    [1] => support@site.org
)

6. Парсинг INI-файла с секциями и комментариями

Пример

// config.ini:
// [database]
// host = localhost
// port = 3306
// [app]
// debug = 1

$config = parse_ini_file('config.ini', true);
echo $config['database']['host']; // localhost
localhost

парсинг в PHP - comments

En
Php function parse (php)