如何使用php从网站中提取特定类型的链接?

时间:2016-05-22 13:39:14

标签: php regex

我正在尝试使用php从网页中提取特定类型的链接

链接就像是......

http://www.example.com/pages/12345667/some-texts-available-here

我想提取上述格式的所有链接。

maindomain.com/pages/somenumbers/sometexts

到目前为止,我可以从网页中提取所有链接,但上面的过滤器没有发生。我怎么能实现这个目标呢?

有什么建议吗?

<?php $html = file_get_contents('http://www.example.com'); //Create a new DOM document $dom = new DOMDocument; @$dom->loadHTML($html); $links = $dom->getElementsByTagName('a'); //Iterate over the extracted links and display their URLs foreach ($links as $link){ //Extract and show the "href" attribute. echo $link->nodeValue; echo $link->getAttribute('href'), '<br>'; } ?>

3 个答案:

答案 0 :(得分:2)

您可以使用DOMXPath并使用DOMXPath::registerPhpFunctions注册一个函数,以便在XPATH查询之后使用它:

function checkURL($url) {
    $parts = parse_url($url);
    unset($parts['scheme']);

    if ( count($parts) == 2    &&
         isset($parts['host']) &&
         isset($parts['path']) &&
         preg_match('~^/pages/[0-9]+/[^/]+$~', $parts['path']) ) {
        return true;
    }
    return false;
}

libxml_use_internal_errors(true);

$dom = new DOMDocument;
$dom->loadHTMLFile($filename);

$xp = new DOMXPath($dom);

$xp->registerNamespace("php", "http://php.net/xpath");
$xp->registerPhpFunctions('checkURL');

$links = $xp->query("//a[php:functionString('checkURL', @href)]");

foreach ($links as $link) {
    echo $link->getAttribute('href'), PHP_EOL;
}

通过这种方式,您只能提取所需的链接。

答案 1 :(得分:0)

这是一个小小的猜测,但如果我弄错了你仍然可以看到这样做的方法。

foreach ($links as $link){
  //Extract and show the "href" attribute.
  If(preg_match("/(?:http.*)maindomain\.com\/pages\/\d+\/.*/",$link->getAttribute('href')){
       echo $link->nodeValue;
       echo $link->getAttribute('href'), '<br>';
  }
}

答案 2 :(得分:0)

您已经使用了解析器,因此您可以前进并在DOM上使用xpath查询。 XPath查询也提供starts-with()之类的函数,因此这可能有效:

$xpath = new DOMXpath($dom);
$links = $xpath->query("//a[starts-with(@href, 'maindomain.com')]");

之后循环遍历:

foreach ($links as $link) {
    // do sth. with it here
    // after all, it is a DOMElement
}