通过preg_match_all从页面url获取所有imdb id

时间:2012-06-28 14:40:25

标签: php curl

如何从页面获取所有IMDB ID?例如,我想从here获取所有ID。在该页面中,网址的格式为:

http://www.imdb.com/title/tt0948470/

我需要使用preg_match_all()从页面获取所有ID - 可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

好的,我没有给出一个熟练的代码。 Firefox中“查看选择源”的简单功能让我看看每个链接的格式都是href属性:

href="/title/tt1615065/"

现在建立一个RegEx是微不足道的。我建议你一个好RegEx tutorial,非贪婪的比赛将完成这项工作。祝你好运!

答案 1 :(得分:1)

好的,我正在给出熟练的代码,但我也会解释一下:

  1. 获取HTML源代码
  2. 解析所有<a> href属性
  3. 如果值匹配,请使用正则表达式进行测试。
  4. 如果匹配,请从链接中提取ID并以不会重复的方式存储它。
  5. 完成。
  6. 实施例/ Demo

    // initialize
    $ids   = array(); 
    $url   = 'http://www.imdb.com/movies-coming-soon/'; # this URL
    $expr  = '//a/@href';                               # these attributes
    $regex = '(/title/(tt\d{5,7})/)u';                  # matching this regex
    $match = 1;                                         # take group 1
    
    // process
    foreach((new DOMXpath(@DOMDocument::loadHTMLFile($url)))->query($expr) as $obj)
        preg_match($regex, $obj->value, $matches)
          && $ids[$matches[$match]] = 0;
        ;
    $ids = array_keys($ids);
    
    // output
    print_r($ids);
    

    注意:您标记了这个问题PHP5,当前稳定的PHP5是5.4,这个示例也是如此;如果您使用curl包装器配置PHP5版本,则此代码为curl。 )

    编辑:降低PHP版本:

    ...
    // process
    $xp = new DOMXpath(@DOMDocument::loadHTMLFile($url));
    foreach($xp->query($expr) as $obj)
    ...
    

    Edit2:只是看到IMDB标记了它的标记,因此可以检索该列表的实际电影条目,而不是该页面上的任何标题链接。

    这需要在使用的xpath表达式上稍微改进一下。因为解析现在更加智能化,所以不存在重复项,因此不需要删除它们:

    // initialize
    $ids   = array();
    $url   = 'http://www.imdb.com/movies-coming-soon/'; # this URL
    $expr  = '//*[@itemtype="http://schema.org/Movie"]
                    //a[@itemprop="url"]/@href';        # these attributes
    $regex = '(/title/(tt\d{5,7})/)u';                  # matching this regex
    $match = 1;                                         # take group 1
    
    // process
    $xp = new DOMXpath(@DOMDocument::loadHTMLFile($url));
    foreach($xp->query($expr) as $obj)
        preg_match($regex, $obj->value, $matches)
            && $ids[] = $matches[$match];
    ;