2015-04-21 1 views
1

Я пытаюсь извлечь значение из следующего фрагмента кода HTML с использованием DOMDocument:значения приобретают с помощью DOMDocument

<h3> 
    <meta itemprop="priceCurrency" content="EUR">€ 

    <meta itemprop="price" content="465.0000">465 
</h3> 

Мне нужно получить значение 465 из этого фрагмента кода. Чтобы воспользоваться этим я использую следующий код:

foreach($dom->getElementsByTagName('h3') as $h) { 
    foreach($h->getElementsByTagName('meta') as $p) { 

    if($h->getAttribute('itemprop') == 'price') { 
     foreach($h->childNodes as $child) { 
      $name = $child->nodeValue; 
         echo $name; 
         $name = preg_replace('/[^0-9\,]/', '', $name); 
         // $name = number_format($name, 2, ',', ' '); 
         if (strpos($name,',') == false) 
         { 
         $name = $name .",00"; 
         } 
     } 
     } 
    } 
    } 

Но этот код не выборки значения ... может кто-нибудь, пожалуйста, помогите мне в этом.

ответ

0

Внутри вашего цикла, вы направляете в неправильном объекте:

foreach($h->childNodes as $child) { 
// ^its not supposed to be `$h` 

Вместо этого вы должны указать на $p.

После этого просто использовать ваше текущее состояние, если оно удовлетворяет, то петли все дочерние узлы:

$price = ''; 
foreach($dom->getElementsByTagName('h3') as $h) { 

    foreach($h->getElementsByTagName('meta') as $p) { 

     if($p->getAttribute('itemprop') === 'price') { 
      foreach($h->childNodes as $c) { 
       if($c->nodeType == XML_TEXT_NODE) { 
        $price .= trim($c->textContent); 
       } 
      } 
      if(strpos($price, ',') === false) { 
       $price .= ',00'; 
      } 
     } 



    } 
} 

Sample Output

Другой способ заключается в использовании запросов XPath:

$xpath = new DOMXpath($dom); 

$meta = $xpath->query('//h3/meta[@itemprop="price"]'); 
if($meta->length > 0) { // found 
    $price = trim($xpath->evaluate('string(./following-sibling::text()[1])', $meta->item(0))); 
    if(strpos($price, ',') === false) { $price .= ',00'; } 
    $currency = $xpath->evaluate('string(./preceding-sibling::meta[@itemprop="priceCurrency"]/following-sibling::text()[1])', $meta->item(0)); 
    $price = "{$currency} {$price}"; 
    echo $price; 
} 

Out

+0

@Ghost ... Я попытался следующий код ... все еще не работает ... Еогеасп ($ dom-> getElementsByTagName ('h3') как $ h) { foreach ($ h-> getElementsByTagName ('meta') as $ p) { if ($ p-> getAttribute ('itemprop') == 'price') { \t \t foreach ($ p-> childNodes as $ child) { $ name = $ child-> nodeValue; } } } } – user3305327

+0

@ user3305327 проверить мою версию, плюс я добавил пример вывода – Ghost

0

Использование JQuery, как это:

var priceCurrency = $('meta[itemprop="priceCurrency"]').attr("content"); 
    var price = $('meta[itemprop="price"]').attr("content"); 
    alert(priceCurrency + " " + price); 

Выходы:

EUR 465.0000 

CODEPEN DEMO

1

У вас есть недопустимый HTML. Где закрывающий тег для мета? Вот почему вы получаете результаты, которые видите.

Чтобы найти то, что вы ищете вы можете использовать XPath:

$doc = new \DOMDocument(); 
$doc->loadXML($yourHTML); 

$xpath = new DOMXpath($doc); 
$elements = $xpath->query("//meta[@itemprop='price']"); 
echo $elements->item(0)->textContent; 
+0

@awons ... спасибо ваше решение также помогло мне ... – user3305327