2011-04-20 22 views
1

我有一個PHP變量包含此HTML代碼:PHP - 提取每一行

<ul> 
    <li> 
     <a href="http://127.0.0.1/mywebsite/about-us">About us</a> 
    </li> 
    <li> 
     <a href="http://127.0.0.1/mywebsite/imprint">Imprint</a> 
    </li> 
    <li> 
     <a href="http://127.0.0.1/mywebsite/terms-and-conditions">Terms and conditions</a> 
    </li> 
    <li> 
     <a href="http://127.0.0.1/mywebsite/delivery">Delivery</a> 
    </li> 
    <li class="last"> 
     <a href="http://127.0.0.1/mywebsite/contacts">Contacts</a> 
    </li> 
</ul> 

我想提取在一個PHP陣列中的每個< LI>線。

我該怎麼做?

非常感謝

+0

你想 ...? – Nigel 2011-04-20 15:57:40

+0

[看這裏](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – austinbv 2011-04-20 15:58:42

回答

2

要獲得的變量的每一行數組中的一個元素。

$lines = explode("\n", $php_variable); 

當你然後遍歷所有的$lines你可以跳過那些你不想要的。

+1

或''$ lines = file('filename.txt');'對於文件中的同一件事情。 (我知道海報說它是在一個變量中,但這值得注意其他情況。) – Wiseguy 2011-04-20 16:01:34

+0

@Wiseguy是的。當我重新閱讀這個問題並意識到我不能使用'file()',因爲它來自一個變量! :-)不錯,但指出。 – Treffynnon 2011-04-20 16:06:19

+0

謝謝,這是最簡單的代碼;) – Bizboss 2011-04-20 16:14:07

1

僞代碼:

While(There is still data) { 
    if(starts with <li>) 
     add to new element of array 
} 
+3

這是我喜歡看到的。向用戶顯示要做什麼,但不知道如何去做。讓他弄清楚:) – AntonioCS 2011-04-20 16:02:22

5

有得開始:

<?php 
$str = '<ul> 
<li><a href="http://127.0.0.1/mywebsite/about-us">About us</a></li> 
<li><a href="http://127.0.0.1/mywebsite/imprint">Imprint</a></li> 
<li><a href="http://127.0.0.1/mywebsite/terms-and-conditions">Terms and conditions</a></li> 
<li><a href="http://127.0.0.1/mywebsite/delivery">Delivery</a></li> 
<li class="last"><a href="http://127.0.0.1/mywebsite/contacts">Contacts</a></li> 
</ul>'; 

$dom = new DOMDocument(); 
$dom->loadXml($str); 

$xpath = new DOMXPath($dom); 

$data = array(); 
foreach ($xpath->query('//li/a') as $node) { 
    // collect some example data 
    $data[] = array(
     'href' => $node->getAttribute('href'), 
     'innerHTML' => $node->nodeValue, 
     'a' => $dom->saveXML($node) 
    ); 
} 

print_r($data); 
+0

這是不錯的;) – Nemoden 2011-04-20 16:04:53

0

有很多方法可以實現你想要的。

我個人喜歡用正則表達式:

$html = <<<STR 
<ul> 
<li><a href="http://127.0.0.1/mywebsite/about-us">About us</a></li> 
<li><a href="http://127.0.0.1/mywebsite/imprint">Imprint</a></li> 
<li><a href="http://127.0.0.1/mywebsite/terms-and-conditions">Terms and conditions</a></li> 
<li><a href="http://127.0.0.1/mywebsite/delivery">Delivery</a></li> 
<li class="last"><a href="http://127.0.0.1/mywebsite/contacts">Contacts</a></li> 
</ul> 
STR; 
preg_match_all('!(?P<li><li[^>]*>.*</li>)!', $html, $matches, PREG_SET_ORDER); 
$result = array(); 
foreach ($matches as $match) { 
    $result[] = $match['li']; 
} 
var_export($result); 

將輸出

array (
    0 => '<li><a href="http://127.0.0.1/mywebsite/about-us">About us</a></li>', 
    1 => '<li><a href="http://127.0.0.1/mywebsite/imprint">Imprint</a></li>', 
    2 => '<li><a href="http://127.0.0.1/mywebsite/terms-and-conditions">Terms and conditions</a></li>', 
    3 => '<li><a href="http://127.0.0.1/mywebsite/delivery">Delivery</a></li>', 
    4 => '<li class="last"><a href="http://127.0.0.1/mywebsite/contacts">Contacts</a></li>', 
) 

注:該解決方案是不排隊依賴,所以你會得到你所有的李時珍甚至他們都對同一條線。

0

爆炸它到一個數組並取出所述第一和最後一個元素:

$lis = explode("\n", $your_variable); 
array_shift($lis); 
array_pop($lis); 
1

隨着爆炸

<ul> 
<?php 
$str = ' 
<li><a href="http://127.0.0.1/mywebsite/about-us">About us</a></li> 
<li><a href="http://127.0.0.1/mywebsite/imprint">Imprint</a></li> 
<li><a href="http://127.0.0.1/mywebsite/terms-and-conditions">Terms and conditions</a> </li> 
<li><a href="http://127.0.0.1/mywebsite/delivery">Delivery</a></li> 
<li class="last"><a href="http://127.0.0.1/mywebsite/contacts">Contacts</a></li> 
'; 

$str_splited = explode("\n", $str); 
$str_splited_num = count($str_splited)-2; 
for ($i = 0; $i <= $str_splited_num; $i++) { 
    echo $str_splited[$i]; 
} 
?> 

</ul> 
0

假設你上述HTML被保存爲$數據。

preg_match_all("/<li>(.+?)<\/li>/s", $data, $matches); 
print_r($matches); 
0

這是另一種方式來做到這一點:

<?php 
    $html = 
    '<ul> 
     <li><a href="http://127.0.0.1/mywebsite/about-us">About us</a></li> 
     <li><a href="http://127.0.0.1/mywebsite/imprint">Imprint</a></li> 
     <li><a href="http://127.0.0.1/mywebsite/terms-and-conditions">Terms and conditions</a></li> 
     <li><a href="http://127.0.0.1/mywebsite/delivery">Delivery</a></li> 
     <li class="last"><a href="http://127.0.0.1/mywebsite/contacts">Contacts</a></li> 
    </ul>'; 

    // Array to store matches 
    $matches = array(); 

    // Array to store items 
    $items; 

    // Store all list items in matches array. 
    preg_match_all('/<li[^>]*>(.*)<\/li>/i', $html, $matches); 

    // The first index of matches will contain all items minus the 'li' tags 
    $items = $matches[1]; 
?>