2013-02-09 92 views
1

a.php只會:PHP Simple HTML Dom:獲取childNodes nodeValue?

<ul id="ul1"> 
    <li id="pt1">Point 1 
     <ul id="ul2"> 
      <li id="pt11">Point 1.1</li> 
      <li id="pt12">Point 1.2</li> 
       <pre class="CodeDisplay"> 
       some codes 
       </pre> 
      <li id="ref">Reference: <a href="link.html" target="_blank">link</a></li> 
     </ul> 
    </li> 
</ul> 

我想只能獲得的nodeValue 「點1」。在JS中,它是:

alert(document.getElementsByTagName("li")[0].childNodes[0].nodeValue); 

但我想在PHP(Simple HTML Dom)中獲取nodeValue;下面是另一個PHP頁面的代碼片段(b.php):

<?php 

include('simple_html_dom.php'); 
$html = file_get_html('http://lifelearning.net63.net/a.php'); 

// stuck here: 
echo $html->getElementsByTagName('ul',0)->getElementsByTagName('li',0)->nodeValue; 
// 

?> 

我用的textContent,但它只是提取下點1含量後代這不是我想要的。我只想要「第一點」。 任何幫助表示讚賞!

回答

1

U可以找這個

<?php $str2 =  ' <ul id="ul1"> ' ;?> 
<?php $str2 .= '<li id="pt1"><div>Point 1</div> ' ;?> 
<?php $str2 .= ' <ul id="ul2"> ' ; ?> 
<?php $str2 .= '  <li id="pt11">Point 1.1</li>' ; ?> 
<?php $str2 .= ' <li id="pt12">Point 1.2</li>' ; ?> 
<?php $str2 .= '  <pre class="CodeDisplay">' ; ?> 
<?php $str2 .= '  some codes' ; ?> 
<?php $str2 .= '  </pre>' ; ?> 
<?php $str2 .= ' <li id="ref">Reference: <a href="link.html" target="_blank">link</a></li>' ; ?> 
<?php $str2 .= ' </ul>' ; ?> 
<?php $str2 .= ' </li> ' ; ?> 
<?php $str2 .= ' </ul>' ; ?> 

<?php 

function getTextBetweenTags($string, $tagname) { 
    $pattern = "/<$tagname ?.*>(.*)<\/$tagname>/"; 
    preg_match($pattern, $string, $matches); 
    return $matches[1]; 
    } 

    $txt = getTextBetweenTags($str2, "div"); 
    echo $txt; 
    ?> 

    will output : --> Point 1 
+1

OP正在使用SimpleHTMLDom。 [插入「正則表達式來解析HTML是不好的」評論] – 2013-02-09 15:59:35

1

試試這個:

<?php 
include('simple_html_dom.php'); 
$html = file_get_html('http://lifelearning.net63.net/a.php'); 
echo $html->find('li[id=pt1] li', 0)->innertext; 

上面的代碼中找到的第一個(下降到li#pt1)匹配li標籤,並讓你的內部文本(文本之間的內容,包括其中的所有HTML,如果有的話)。

看看SimpleHTMLDom docs。有很多方法和示例可以從HTML輸出中找到內容(ID,類等)。 SimpleHTMLDom主要遵循jQuery/CSS選擇器。

請注意,如果您不使用innertext方法,它將返回一個SimpleHTMLDom節點,您需要在顯示之前對其進行處理。

如果沒有匹配的元素,它將返回一個E_WARNING錯誤消息。因此,請確保您的輸入包含需要的元素,或者確保元素存在與isset()

+0

感謝您的回覆。但它實際上返回「點1.1」而不是「點1」。 – 2013-02-10 11:00:00

0

跟別人網上的幫助下,一個簡單的解決方案建議:

$html = new DOMDocument(); 
$html->loadHTMLFile('http://lifelearning.net63.net/a.php'); 
echo $html->getElementsByTagName('li')->item(0)->childNodes->item(0)->textContent; // returns "Point 1" 

我所學到的是,

首先,在我的情況下,不需要任何外部庫,DOMDocument可以完成獲取網頁HTML DOM的工作。

其次,使用item()和childNodes。非常像它是什麼在JS:

document.getElementsByTagName("li")[0].childNodes[0].nodeValue 

但謝謝你的所有答覆。