Не парсит кириллицу PHP

104
09 сентября 2019, 22:50

Есть PHP парсер на библиотеке DiDOM. Настроен был на одном тестовом сервере, работал. Сейчас перенесен на другом, и там почему то не парсит значение с кириллицей.

Теряюсь в догадках, почему такое происходит. Интересно было бы услышать подсказку, в сторону каких настроек смотреть. Подозреваю, что php, но что конкретно?...

<?php
$start = microtime(true);
require_once('vendor/autoload.php');
use DiDom\Document;
$document = new Document('http://donor.ru/catalog/tovar/', true);
//  H1
    $main_heading = $document->find('.c_name')[0]->text();
//  Текущая дата
    $date_res = date("mdYHis");
//  Фото        
    $foto = $document->find('.gallerylayer img::attr(src)')[0];
    $foto_full = ("https://donor.ru$foto");
    $foto_name = "id1$date_res.jpg";
    copy ( $foto_full, "/fotodir/$foto_name" );
//  Цена    
    $price = $document->find('.c_price')[0];
    $price_result = preg_replace('/[^\d]+/', '', $price);
//  Бренд
    $brand = $document->find('.item_info_section')[0]->first('dl')->xpath('//dt//strong')[0]->text();
//  Состав в % для вывода
    $sostav = $document->find('.c_mix')[0]->text();
//  Состав без % для фильтра
    $sostav_noperc = preg_replace(['~[^\pL\s,]+~us', '~-~'], ['', ' '], $sostav);
//  Длина
    $dlina = $document->find('.item_info_section')[0]->first('dl')->xpath('//dt')[3]->text();
    $dlina_result = preg_replace('/[^\d]+/', '', $dlina);
//  Вес
    $ves = $document->find('.item_info_section')[0]->first('dl')->xpath('//dt')[4]->text();
    $ves_result = preg_replace('/[^\d]+/', '', $ves);
//  Страна
    $country = $document->find('.item_info_section')[0]->first('dl')->xpath('//dt//strong')[5]->text();

UPD

Заметил, что такое происходит с сайтами, у которых доктайп "-//W3C//DTD XHTML 1.0 Transitional//EN". Один ресурс, у которого !DOCTYPE html и html lang="ru" - данные в кириллице получает корректно

Answer 1

В общем, дело было в кодировке страниц донора. Решением стало подключение третьего параметра в парсинг 'windows-1251':

$document = new Document('http://donor.ru/catalog/tovar/', true, 'windows-1251');
READ ALSO
Почему может не работать shortcode в acf?

Почему может не работать shortcode в acf?

Нужно что бы работали шорткоды в дополнительных поляхИспользую хук с официального сайта

111
Как заменить прозрачный фон КАРТИНКИ на белый средствами PHP?

Как заменить прозрачный фон КАРТИНКИ на белый средствами PHP?

Как заменить прозрачный фон КАРТИНКИ на белый средствами PHP?

106
запуск php+mysql скрипта в командной строке

запуск php+mysql скрипта в командной строке

Есть настроенный веб-сервер с php, mysqlЧерез браузер все работает хорошо, решил запустить php скрипт из командной строки, чтобы потом сделать...

118