xml — DOMXPath / Получить значение только после определенного вхождения

Ребята, я разбираю URL, чтобы получить HTML-элементы dom.

Вот мой код:

<?PHP
$url = 'http://www.sportsdirect.com/nike-satire-mens-skate-shoes-242188?colcode=24218822';

libxml_use_internal_errors(true);
$dom = new DOMDocument;

$dom->loadHTMLFile($url);

$xp = new DOMXPath($dom);
$qry = '//script[starts-with(normalize-space(.), "var colourVariantsInitialData")]';

$rawtxt = $xp->query($qry)->item(0)->nodeValue;$jsonStart = strpos($rawtxt, '[');
$jsonEnd = strrpos($rawtxt, ']');

$collections = json_decode(substr($rawtxt, $jsonStart, $jsonEnd - $jsonStart + 1));

foreach ($collections[1]->SizeVariants as $item) {
$SizeName = $item->SizeName;
$PriceUnformated = $item->ProdSizePrices->SellPrice;

$find = array('£');
$replace   = array('');
$Price = str_replace($find, $replace, $PriceUnformated);

echo "SizeName: <b>$SizeName</b> - Price: <b>$Price</b><br>";

}

Этот код извлекает «текст» из скрипта из выходного источника.
Вот полный текст этого скрипта: http://pastebin.com/FwK9Z8CP

Мой код дает следующий результат:

SizeName: 7 (41) - Price: 27.00
SizeName: 8 (42.5) - Price: 36.00
SizeName: 9 (44) - Price: 36.00
SizeName: 9.5 (44.5) - Price: 36.00
SizeName: 11 (46) - Price: 36.00

Мой вопрос:

Как я могу получить только результат для определенного SizeName, например, скажем, для SizeName 7 (41)?

Заранее спасибо!

1

Решение

$specific есть строка, которую вы хотите найти. Изменить foreach в вашем коде это:

$specific = '7 (41)';

foreach ($collections[1]->SizeVariants as $item) {
$SizeName = $item->SizeName;

if(trim($SizeName) == trim($specific)) {

$PriceUnformated = $item->ProdSizePrices->SellPrice;

$find = array('£');
$replace   = array('');
$Price = str_replace($find, $replace, $PriceUnformated);

echo "SizeName: <b>$SizeName</b> - Price: <b>$Price</b><br>";
}
}
1

Другие решения

Как я могу получить только результат для определенного SizeName, например, скажем, для SizeName 7 (41)?

Поскольку текст в целом является частью документа XML, вы не можете использовать синтаксический анализатор XML.

Технически, это не вопрос xpath.

Вы уже анализируете строку как JSON, и вам это удается. Но вы все еще не уверены, достаточно.

Поэтому вы можете разработать модель данных, которая работает поверх данных JSON, а затем реализовать фильтр для них. Простую модель можно сделать с Interator пройти через предметы и FilterIterator выбирать только те, которые имеют конкретные значения свойств.

...

$xpath  = new DOMXPath($dom);
$query  = '//script[starts-with(normalize-space(.), "var colourVariantsInitialData")]';
$script = $xpath->query($query)->item(0)->nodeValue;

$variants = SizeVariants::create($script); # Iterator
$variants = new SizeFilter($variants); # FilterIterator

foreach ($variants as $item) {
$SizeName        = $item->SizeName;
$PriceUnformated = $item->ProdSizePrices->SellPrice;

$find    = array('£');
$replace = array('');
$Price   = str_replace($find, $replace, $PriceUnformated);

echo "SizeName: **$SizeName** - Price: **$Price**\n";
}

Примерный вывод (уценка):

SizeName: 7 (41) — Цена: 27,00

А также пример кода.

1

По вопросам рекламы [email protected]