2015-04-05 58 views
1

我想獲得文本節點的包裝標籤。鑑於這樣的任意HTMLPHP DOM:如何獲得包含文本節點屬性的包裝標籤?

<html><body> 
<p>salalala</p> 
<ul><li>hehehe</li></ul> 
<div class="main"> 
    <div class="text"> 
    <span style="cufon whatever blablabla"> 
    Capture this text 1 
    </span> 
    </div> 
</div> 

<div class="main"> 
    <div class="text"> 
    text 2 
    </div> 
</div> 
</body> 
</html> 

我想獲得包裝標籤爲「捕獲這個文本1」是

<div class="main"> 
    <div class="text"> 
    <span style="cufon whatever blablabla"> 

這只是爲了演示,他們可以是任何東西,但給予了文字匹配,我如何檢索包裝標籤?

我一直在考慮使用PHP DOM,並通過樹中找到textnode,並從中恢復工作。我不確定如何提取包裝標籤。

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
//print_r($doc->childNodes); 

print_children($doc); 


function print_children($object){ 

    if ($object->nodeName == "#text" AND strpos("Capture this text 1",trim($object->data)) !== false) { 
     print "Parent: "; 
     print_r($object->parentNode); 
     } 

    foreach($object->childNodes as $child) { 
    print_r($child); 
    print_children($child); 
    } 
} 

回答

0

我使用fsockopen來檢索一些我想要的網站的HTML。這是我目前的功能如何做到這一點。

$server = 'www.somesite.com'; // or an IP address 
$port = 80; 

function getTextFromHTML($server, $port, $timeout=100){ 
    $socket = fsockopen($server, $port, $errno, $errstr, $timeout); 
    fputs($socket, $request); 
    if ($size > 0) { 
     $start_el = 'div class="main">'; 
     $stop_el = '</div>'; 
     $f_start = false; 
     $f_stop = false; 

     $tmp=""; 
     while (!feof($socket)) 
     { 
      $buffer = fgets($socket,$size); 
      if(!$f_start){ 
       $strpos = mb_strpos($buffer, $start_el); 
       if ($strpos !== false) 
       { 
        $buffer = mb_substr($buffer, $strpos, $size); 
        $f_start = true; 
       } 
      } 

      if ($f_start && !$f_stop) 
      { 
       $strpos = mb_strpos($buffer, $stop_el); 
       if ($strpos !== false) 
       { 
        $f_stop = true; 
       } 
       $tmp .= $buffer; 
      } 
     }    

    }  
    fclose($socket); 
    return $tmp; 
} 

你只需要在$ start_el和$ stop_el中進行一些配置。

希望這會幫助你得到一個問題點