2010-08-03 96 views
2

我正在试验使用WordPress的自动注册(即RSS驱动的博客张贴),而所缺少的是一个组件,用RSS的URL链接内容自动填充帖子内容(RSS与解决方案无关)。简单的PHP屏幕抓取功能

使用标准的PHP 5,我怎么可以创建一个名为fetchHTML功能([URL])返回那是<body>...</body>标签之间发现了一个网页的HTML内容?

请让我知道是否有任何先决条件“包括”。 谢谢。

+1

会让网络更加垃圾? – 2010-08-04 04:26:33

回答

3

假设它永远是<body>而不是<BODY><body style="width:100%">或任何东西,除了<body></body>,并与你不应该使用正则表达式解析HTML,即使我约而至,这里亚去了警告:

<?php 

function fetchHTML($url) 
{ 
    $feed = '<body>Lots of stuff in here</body>'; 

    $content = file_get_contents($url); 

    preg_match('/<body>([\s\S]{1,})<\/body>/m', $content, $match); 

    $content = $match[1]; 

    return $content; 


} // fetchHTML 
?> 

如果你echo fetchHTML([some url]);,你会得到body标签之间的html。

请注意原始警告。

+0

非常简单 - 很好的答案。我将如何检查标签的不同执行方式(如上面强调的那样)?是否有不区分大小写的正则表达式开关? – Yaaqov 2010-08-03 19:33:26

+0

有。这只是我(在模式结束前的那个m之前)。但是,例如,http://stackoverflow.com将无法正常工作,因为开头体标签是'' – hookedonwinter 2010-08-03 19:34:18

+0

明白了。感谢指针。 – Yaaqov 2010-08-03 19:41:56

3

我觉得你使用像SimpleDom一类的更好 - >http://sourceforge.net/projects/simplehtmldom/提取数据,你不需要写这样复杂的正则表达式

+0

谢谢。不错的图书馆,使用直观,它包括jquery样选择器。截至2013年年中,它似乎仍然是一个活跃的项目。 – 2013-09-16 01:32:52

5

好,这是一个DOM解析器的代码示例的要求。

<?php 

function fetchHTML($url) 
    { 

    $content = file_get_contents($url); 

    $html=new DomDocument(); 
    $body=$html->getelementsbytagname('body'); 
    foreach($body as $b){ $content=$b->textContent; break; }//hmm, is there a better way to do that? 
    return $content; 
    } 
+0

从来没有见过DomDocument()!我必须确认一下。它使我想仅仅使用jQuery的解决方案...'(<?= $ content?>).find('body').html();'heh – hookedonwinter 2010-08-04 05:20:12

+0

@hookedonwinter哈...这将工作,我猜!如果你在浏览器中打开它,嗯......这让我想起,实际上有一种叫做phpquery的http://code.google.com/p/phpquery/,它非常酷! – JAL 2010-08-04 14:44:05

+0

JL现在你已经给了我足够的时间来学习下一周。谢谢! – hookedonwinter 2010-08-04 14:54:43