簡體   English   中英

DOMXPath / PHP-僅在特定情況下獲取值

[英]DOMXPath/PHP - Get a value only after specific occurrence

伙計們,我正在解析一個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)?

提前致謝!

$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>";
}
}

我如何只獲取特定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";
}

示例輸出(降價):

大小名稱: 7(41) -價格: 27.00

示例代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM