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

问题描述:

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

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

我需要使用preg_match_all()页的所有ID - 可以在任何帮助我吗?

+1

请把更多的精力投入到格式化您的问题 - 使用降价,使其尽可能地易读和使用如果可以的话,可以使用英文拼写检查程序(在Firefox中,这是标准提供的编辑框)。 – halfer

好吧,我给煮熟了的代码,但我也解释:

  1. 获取HTML源
  2. 解析所有<a>href属性
  3. 测试用正则表达式,如果他们的价值火柴。
  4. 如果匹配,请从链接中提取id并将其存储为不会重复的方式。
  5. 完成。

例/ 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) 
... 

编辑2:只看到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]; 
; 
+0

解析错误:语法错误,意外T_OBJECT_OPERATOR在线12 我认为我的php版本不受支持 –

+0

@M索娜:你有哪一个?无论如何,做了一个编辑,应该这样做,除非你使用我怀疑的一些非常古老的PHP版本。 – hakre

+0

你好,现在工作谢谢 我的php版本是5.3.13 –

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

href="/title/tt1615065/" 

现在应当是微不足道建立一个正则表达式。我建议你一个好的RegEx tutorial和一个非贪婪的比赛将完成这项工作。祝你好运!