2011-03-15 53 views
0

這是我到目前爲止有:走通HTML在PHP

我的字符串:

$str = "<ul> 
<li><a name="valuehere1" title="titlehere" href="/channel/london/">Link1</a></li> 
<li><a name="valuehere2" title="titlehere" href="/channel/games/">Link1</a></li> 
<li><a name="valuehere3" title="titlehere" href="/channel/sport/">Link1</a></li> 
</ul>"; 

我的PHP到目前爲止(和我卡住):

$dom = new domDocument; 
$dom->loadHTML($str); 
$children = $dom->getElementsByTagName('li')->item(0)->childNodes->getAttribute('name'); 
$out = array(); 
foreach ($children as $child) { 
    $out[] = $dom->saveXML($child); 
} 

我試圖在LI比賽的比賽中(在這個例子中他們是「倫敦」,「比賽」,「運動」)提取A標籤的NAME屬性值。當我通過「遊戲」時,它應該給我輸出「valuehere2」。由於我有一些限制,這必須在服務器端完成。有人可以幫我解決這個問題嗎?

感謝, 大號

+0

你的字符串裏有雙引號 - 讓他們逃脫它們:\「 –

+0

爲什麼你要首先獲取li,何時需要a元素?爲什麼不直接獲取元素?或者使用XPath獲取這些元素的名稱屬性直接? – Gordon

+0

[(PHP5)可能的重複使用PHP DOM或Regex從HTML中提取標題標籤和RSS提要地址](http://stackoverflow.com/questions/3054347/php5-extracting-a -title-tag-and-rss-feed-address-from-html-using-php-dom-or-reg) - 包含相同的理由並說明如何使用XPath。 – Gordon

回答

0

正則表達式來救援?

[~]% cat test.php 
<?php 

$str = '<ul> 
<li><a name="valuehere1" title="titlehere" href="/channel/london/">Link1</a></li> 
<li><a name="valuehere2" title="titlehere" href="/channel/games/">Link1</a></li> 
<li><a name="valuehere3" title="titlehere" href="/channel/sport/">Link1</a></li> 
</ul>'; 

preg_match_all('/<li><a name="(.*)" title/', $str, $m); 

print_r($m); 

?> 

[~]% php test.php 
Array 
(
    [0] => Array 
     (
      [0] => <li><a name="valuehere1" title 
      [1] => <li><a name="valuehere2" title 
      [2] => <li><a name="valuehere3" title 
     ) 

    [1] => Array 
     (
      [0] => valuehere1 
      [1] => valuehere2 
      [2] => valuehere3 
     ) 

) 
+0

嘎。用正則表達式解析HTML。可怕的可怕的恐怖。 –

+0

這取決於上下文和你究竟是什麼解析......問題是沒有上下文發佈,所以我不知道哪種解決方案是最好的在這種情況下(我假設$ str張貼只是一個片段從一個),但我當然不會說使用DOM從HTML中提取數據是「可怕的可怕的恐怖」;-)恕我直言,兩種方法都有優點和缺點。 – Carpetsmoker

+0

感謝CS,我建立在你的建議之上,它​​很適合我的空間。謝謝:) – lshettyl

1

你已經差不多了。但是,您的代碼正在獲取它找到的第一個li的屬性,並嘗試將該屬性值用作數組來循環。你想要的是:

$children = $dom->getElementsByTagName('li'); 
$out = array(); 
foreach ($children as $child) { 
    if ($child->item(0)->childNodes->getAttribute('name')) { 
     $out[] = $dom->saveXML($child); 
    } 
} 

的getElementsByTagName返回DOMElementList(或其他),這是一個迭代數組。做getAttribute()的東西只是返回一個字符串。

+0

'getElementByTagName'返回一個['DOMNodeList'](http://de2.php.net/manual/en/class.domnodelist.php),它不是一個數組,而是一個對象。 ['childNodes'](http://de2.php.net/manual/en/class.domnode.php#domnode.props.childnodes)也是'DOMNodeList',它沒有'getAttribute'方法。代碼無法工作。 – Gordon