@Sp1keazyYT

Как правильно сделать функцию .nextUntil из JQuery в PHPQuery?

Добрый день. Имеется код:
function getParamsXCom($articul) 
{
	// подключаем страницу html товара
	$_products = phpQuery::newDocument(file_get_contents('https://www.xcom-shop.ru/search/?o=n&s='.$articul));
	$link = 'https://www.xcom-shop.ru' . $_products->find('div.wrap div.name a')->attr('href');
	$detail_page = phpQuery::newDocument(file_get_contents($link));
	
	$arr = [];
	foreach ($detail_page->find('#prop-columns .prop-line.delimiter') as $char) {
		$category = pq($char);
		$props = [];
		$i = 0;

		// подобие функции .nextUntil в JQuery
		foreach($category as $child) {
			if($i == 2){ break; }
			$i = (pq($child)->attr('class') == 'delimiter') ? ($i + 1) : $i;
			if($i == 0){ continue; }
			
			foreach(pq($child) as $el) {
				$props[$el->find('.call').text()] = $el->find('.prop-value')->text();
			}
		}
		
		$arr[$category->text()] = $props;
	}
	
	print_r($arr);
}

print_r(getParamsXCom('4YV96ES'));

Данный код парсит характеристики товара (артикул у которого 4YV96ES). Ссылка на товар: https://www.xcom-shop.ru/hp_proone_440_g4_645770.html

У меня также имеется JS-код:
let arr = {};
$('#prop-columns .prop-line.delimiter').each(function () {
    const category = $(this);
    let props = {};
    category.nextUntil('.delimiter').each(function() {
        const item = $(this);
        props[item.find('.call').text()] = item.find('.prop-value').text();
    });
    arr[category.text()] = props;
});
console.log(arr);

При исполнении которого в консоли браузера формируется массив с полной иерархией характеристик товара:
86b813cea5.png

Данный код я хотел переделать под PHP парсинг и использовал библиотеку PHPQuery, в которой можно использовать функции JQuery. Код я прикрепил в самом начале описания вопроса.

Теперь к проблеме - так как в PHPQuery нет штатной функции nextUntil, поэтому я написал ей подобие (прокомментировал у себя этот код). В итоге при исполнении моей функции с полным парсингом и выводом итогового массива с полной иерархией характеристик я получаю только названия групп характеристик, а что находится в этих группах я не получаю. С чем это может быть связано?

7141662131.png
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
@Sp1keazyYT Автор вопроса
Выкладываю неплохое решение:
$url = 'https://www.xcom-shop.ru/hp_proone_440_g4_645770.html';

$html = file_get_contents($url, false, stream_context_create([
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false,
    ],
]));

preg_match('~<div id="card_prop">.*<div class="prop\-column right"></div>~is', $html, $preg);

$exp = explode('<div class="short_desc prop-line delimiter">', $preg[0]);

unset($exp[0]);

$result = [];

foreach ($exp as $item)
{
    preg_match('~<h3>([^<]+)</h3>~i', $item, $title);
    
    preg_match_all('~<div class="call">([^<]+)</div>\s*?<div class="prop-value">(.+)</div>~isU', $item, $rows, PREG_SET_ORDER);
    
    foreach ($rows as $row)
    {
        $result[ trim($title[1]) ][ trim($row[1]) ] = trim($row[2]);
    }
}

echo '<pre>';
print_r($result);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы