2011-04-20 36 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]; 
?>