Обработка информации средствами 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