2013-03-03 17 views
6

Diese Frage scheint oft beantwortet worden zu sein, aber ich kann immer noch nicht scheinen, die Teile zusammen zu setzen.Holen Sie alle Elemente nach Klassennamen mit DOMDocument

Ich möchte Knotenwert jeder Klasse namentlich erhalten. zum Beispiel

<td class="thename"><strong>32</strong></td> 
<td class="thename"><strong>12</strong></td> 

würde Ich mag die 32 und die 12 ich dies für Art erfordert von für Schleife übernehmen greifen, aber nicht sicher, wie genau über deren Umsetzung zu gehen. Hier ist, was ich bisher habe

$domain = "http://domain.com"; 
$dom = new DOMDocument(); 

$dom->loadHTMLFile($domain); 
$xpath = new DomXpath($dom); 
$div = $xpath->query('//*[@class="thename"]')->item(0); 
$stuff = $div ->textContent; 

echo($stuff); 

Antwort

11

Ist das, was Sie suchen?

$result = array(); 

    $doc = <<< HTML 
    <html> 
     <body> 
      <div>1 
       <span>2</span> 
      </div> 
      <div>3</div> 
      <div>4 
       <span class="class1"><strong>5</strong></span> 
       <span class="class1"><strong>6</strong></span> 
       <span>7</span> 
      </div> 
     </body> 
    </html> 
HTML; 
    $classname = "class1"; 
    $domdocument = new DOMDocument(); 
    $domdocument->loadHTML($doc); 
    $a = new DOMXPath($domdocument); 
    $spans = $a->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]"); 

    for ($i = $spans->length - 1; $i > -1; $i--) { 
     $result[] = $spans->item($i)->firstChild->nodeValue; 
    } 

    echo "<pre>"; 
    print_r($result); 
    exit(); 
+1

, die den Trick zu tun scheint. Kannst du die XPath-Abfrage abbrechen? Das ist alles neu für mich. danke – Sammy

+0

Ich benutze [XPath 1.0] (http://cweiske.de/tagebuch/XPath%3A%20Select%20element%20by%20class.htm), es macht keinen Unterschied. Sie können Ihre Varianz verwenden '$ query = '// * [@ class ="'. $ ClassName. '"]';' – user2112300

+0

$ img_tags = $ tags-> query ("// * [enthält (concat ('') , normalize-space (@class), ''), 'thumbBlock')]/div/div/a/img "); das gibt mir 500 internen Serverfehler – Luckyy

3

ich habe einfach diese in PHP

$dom = new DOMDocument('1.0'); 
      $classname = "product-name"; 

      @$dom->loadHTMLFile("http://shophive.com/".$query); 
      $nodes = array(); 
      $nodes = $dom->getElementsByTagName("div"); 
      foreach ($nodes as $element) 
      { 
       $classy = $element->getAttribute("class"); 
       if (strpos($classy, "product") !== false) 
       { 
         echo $classy; 
         echo '<br>'; 
       } 

      } 
+1

Was ist, wenn Ihre Produktklasse die erste Klasse in der Zeichenfolge ist? – MastaBaba

+0

hat Ihren Standpunkt nicht verstanden? –

+0

Sie überprüfen die Zeichenfolge Position für "Produkt", ob es größer als 0 ist. Aber, wenn es in der ersten Position ist, würde Ihre Überprüfung fehlschlagen (in strpos ($ classy, ​​"Produkt")> 0)? – MastaBaba