2013-03-03 3 views
6

이 질문은 여러 번 답변 된 것으로 보이지만 여전히 조각을 함께 넣는 것 같습니다.DOMDocument를 사용하여 클래스 이름으로 모든 요소 가져 오기

모든 클래스의 노드 값을 이름으로 가져 오려고합니다. 예를

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

위해 나는이 루프의 종류 그러나 그것을 구현하는 방법에 대한 갈 방법을 정확하게 확실하지 위해 필요로 가정합니다 (32) 및 (12)를 잡고 싶습니다. 자, 내가 무엇을 가지고 지금까지 가지고있다

$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); 

답변

11

이게 당신이 찾고 있는게 뭐지?

$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

이했다. XPath 쿼리를 분해 할 수 있습니까? 이것은 나에게 모두 새로운 것입니다. 감사합니다 – Sammy

+0

나는 [XPath 1.0] (http://cweiske.de/tagebuch/XPath%3A%20Select%20element%20by%20class.htm)을 사용합니다. 아무런 차이가 없습니다. 당신은 분산 변수'$ query = '// * [@ class = "'. $ className. '"]';를 사용할 수 있습니다. – user2112300

+0

$ img_tags = $ tags-> query ("// (concat (' , normalize-space (@class), ''), 'thumbBlock')]/div/div/a/img "); 이 날 500 내부 서버 오류를 준다 – Luckyy

3

나는 단순히 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

귀하의 제품 클래스 문자열의 첫 번째 클래스는 무엇입니까? – MastaBaba

+0

당신의 요점을 찾지 못하셨습니까? –

+0

0보다 큰지 여부에 관계없이 "product"의 문자열 위치를 확인합니다. 그러나 첫 번째 위치에 있으면 strpos ($ classy, ​​"product")> 0)에서 검사가 실패하지 않습니까? – MastaBaba

관련 문제