从页面抓取所有链接

时间:2013-12-22 11:48:52

标签: php regex url preg-match-all

我想从页面中获取所有链接(href)。

这是我的实际代码:

preg_match_all('/href=.([^"\' ]+)/i', $content, $anchor);

但是这只会抓取域名和子域名(例如name.name.exname.ex),但不会获取name.ex/name/name.php等自定义网址。

任何人都可以帮助正则表达式吗?

4 个答案:

答案 0 :(得分:3)

我建议不要使用正则表达式。我建议您使用DOM来解析并获得结果。

以下是使用DOMXPath

的示例
$html = '<a href="name.ex/name/name.php">text</a>
         <a href="foo.com">foobar</a>';

$doc = new DOMDocument();
$doc->loadHTML($html); 

$xpath = new DOMXPath($doc);

foreach ($xpath->query('//a') as $link) {
   $links[] = $link->getAttribute('href');
}

print_r($links);

请参阅Working demo

答案 1 :(得分:1)

使用DOMDocument更容易:

$doc = new DOMDocument();
@$doc->loadHTML($html);

$linkNodes = $doc->getElementsByTagName('a');

foreach($linkNodes as $linkNode) {
    $urls[] = $linkNode->getAttribute('href');
}

print_r($urls);

答案 2 :(得分:0)

试试这个正则表达式:

$pattern = "/href="([^\s"]+)/";
preg_match_all($pattern, $content, $matches);

if (count($matches[1]) {
  foreach($matches[1] as $match)
    echo $match . "<br />";
}

答案 3 :(得分:0)

你走了!

$string = "<a href='test.php/url' class=>test</a>testar <a href='test2.php/url2' class=>test</a>";
$pattern = "/<a(?:[^>]*)href=([^ ]*)(?:[^>]*)>/";

preg_match_all($pattern, $string, $matches);

foreach($matches[1] as $match){
    echo $match;
}