试图从网页上抓取所有Facebook链接

时间:2013-01-20 07:13:22

标签: php regex

我正试图从Facebook抓取链接。但是,我得到一个空白页面,没有任何错误消息。

我的代码如下:

<?php
error_reporting(E_ALL);

function getFacebook($html) {

    $matches = array();
    if (preg_match('~^https?://(?:www\.)?facebook.com/(.+)/?$~', $html, $matches)) {
        print_r($matches);

    }
}

$html = file_get_contents('http://curvywriter.info/contact-me/');

getFacebook($html);

它出了什么问题?

1 个答案:

答案 0 :(得分:1)

更好的替代方案(也更强大)是使用DOMDocument和DOMXPath:

<?php
error_reporting(E_ALL);

function getFacebook($html) {

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

    $query = new DOMXPath($dom);

    $result = $query->evaluate("(//a|//A)[contains(@href, 'facebook.com')]");

    $return = array();

    foreach ($result as $element) {
        /** @var $element DOMElement */
        $return[] = $element->getAttribute('href');
    }

    return $return;

}

$html = file_get_contents('http://curvywriter.info/contact-me/');

var_dump(getFacebook($html));

但是,针对您的具体问题,我做了以下事情:

  • preg_match更改为preg_match_all,以便在首次发现后不会停止。
  • 从模式中删除了^(开始)和$(结束)字符。您的链接将显示在文档的中间,而不是开头或结尾(绝对不是两者!)

所以修正后的代码:

<?php
error_reporting(E_ALL);

function getFacebook($html) {

    $matches = array();
    if (preg_match_all('~https?://(?:www\.)?facebook.com/(.+)/?~', $html, $matches)) {
        print_r($matches);

    }
}

$html = file_get_contents('http://curvywriter.info/contact-me/');

getFacebook($html);