DOMXPath / PHP - 仅在特定事件发生后获取值

时间:2015-03-31 19:38:30

标签: php xml json algorithm 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>";

}

此代码正在提取&#34; text&#34;来自输出源的脚本。 以下是此脚本的完整文字: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)?

提前致谢!

2 个答案:

答案 0 :(得分: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 :(得分: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

the example code