我需要捕获给定html中的所有链接。
以下是示例代码:
<div class="infobar">
... some code goes here ...
<a href="/link/some-text">link 1</a>
<a href="/link/another-text">link 2</a>
<a href="/link/blabla">link 3</a>
<a href="/link/whassup">link 4</a>
... some code goes here ...
</div>
我需要获取以div.infobar
/link/
内的所有链接
我试过了:
preg_match_all('#<div class="infobar">.*?(href="/link/(.*?)") .*?</div>#is', $raw, $x);
但它给了我唯一的第一场比赛。
感谢您的建议。
答案 0 :(得分:7)
我建议使用DOMDocument来达到这个目的,而不是使用正则表达式。请考虑以下简单代码:
$content = '
<div class="infobar">
<a href="/link/some-text">link 1</a>
<a href="/link/another-text">link 2</a>
<a href="/link/blabla">link 3</a>
<a href="/link/whassup">link 4</a>
</div>';
$dom = new DOMDocument();
$dom->loadHTML($content);
// To hold all your links...
$links = array();
// Get all divs
$divs = $dom->getElementsByTagName("div");
foreach($divs as $div) {
// Check the class attr of each div
$cl = $div->getAttribute("class");
if ($cl == "infobar") {
// Find all hrefs and append it to our $links array
$hrefs = $div->getElementsByTagName("a");
foreach ($hrefs as $href)
$links[] = $href->getAttribute("href");
}
}
var_dump($links);
array(4) {
[0]=>
string(15) "/link/some-text"
[1]=>
string(18) "/link/another-text"
[2]=>
string(12) "/link/blabla"
[3]=>
string(13) "/link/whassup"
}
答案 1 :(得分:2)
修改我之前的回答。您需要分两步完成:
//This first step grabs the contents of the div.
preg_match('#(?<=<div class="infobar">).*?(?=</div>)#is', $raw, $x);
//And here, we grab all of the links.
preg_match_all('#href="/link/(.*?)"#is', $x[0], $x);
答案 2 :(得分:2)
http://simplehtmldom.sourceforge.net/:
// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');
// Find all links
foreach($html->find('a') as $element)
echo $element->href . '<br>';
答案 3 :(得分:0)
试试这个(我添加了+
):
preg_match_all('#<div class="infobar">.*?(href="/link/(?:.*?)")+ .*?</div>#is', $raw, $x);