3

我正在从我的 Flickr 帐户中将图像提取到我的网站,并且我使用了大约九行代码来创建一个 preg_match_all 函数来提取图像。

我已经读过好几次了,通过 DOM 解析 HTML 更好。

就个人而言,我发现通过 DOM 解析 HTML 更加复杂。我编写了一个类似的函数来使用 PHP 的 DOMDocument 拉取图像,它大约有 22 行代码。创建需要一段时间,我不确定有什么好处。

每个代码的页面几乎同时加载,所以我不确定我为什么要使用 DOMDocument。

DOMDocument 的工作速度是否比 preg_match_all 快?

如果您有兴趣,我将向您展示我的代码(您可以看到 DOMDocument 代码有多长):

//here's the URL
$flickrGallery = 'http://www.flickr.com/photos/***/collections/***/';

//below is the DOMDocument method
$flickr = new DOMDocument();
$doc->validateOnParse = true;
$flickr->loadHTMLFile($flickrGallery);
$elements = $flickr->getElementById('ViewCollection')->getElementsByTagName('div');
$flickr = array();
for($i=0;$i<$elements->length;$i++){
    if($elements->item($i)->hasAttribute('class')&&$elements->item($i)->getAttribute('class')=='setLinkDiv'){
        $flickr[] = array(
                          'href' => $elements->item($i)->getElementsByTagName('a')->item(0)->getAttribute('href'), 
                          'src' => $elements->item($i)->getElementsByTagName('img')->item(0)->getAttribute('src'), 
                          'title' => $elements->item($i)->getElementsByTagName('img')->item(0)->getAttribute('alt')
                          );
    }
}
$elements = NULL;
foreach($flickr as $k=>$v){
    $setQuery = explode("/",$flickr[$k]['href']);
    $setQuery = $setQuery[4];
    echo '<a href="?set='.$setQuery.'"><img src="'.$flickr[$k]['src'].'" title="'.$flickr[$k]['title'].'" width=75 height=75 /></a>';
}
$flickr = NULL;

//preg_match_all code is below

$sets = file_get_contents($flickrGallery);
preg_match_all('/(class="setLink" href="(.*?)".*?class="setThumb" src="(.*?)".*?alt="(.*?)")+/s',$sets,$sets,PREG_SET_ORDER);
foreach($sets as $k=>$v){
    $setQuery = explode("/",$sets[$k][2]);
    $setQuery = $setQuery[4];
echo '<a href="?set='.$setQuery.'"><img src="'.$sets[$k][3].'" title="'.$sets[$k][4].'" width=75 height=75 /></a>';
}
$sets = NULL;
4

2 回答 2

3

如果您愿意为正确性而牺牲速度,那么请继续尝试使用正则表达式滚动您自己的解析器。

你说“就我个人而言,我发现通过 DOM 解析 HTML 更加复杂。” 您是否正在优化结果的正确性,或者您编写代码的难易程度?

如果您想要的只是速度和不复杂的代码,为什么不直接使用它:

$array_of_photos = Array( 'booger.jpg', 'aunt-martha-on-a-horse.png' );

或者也许只是

$array_of_photos = Array();

它们在恒定时间内运行,并且很容易理解。没问题,对吧?

那是什么?您想要准确的结果吗?然后不要用正则表达式解析 HTML

最后,当您使用 DOM 之类的解析器时,您使用的是经过多年良好测试和调试的一段代码。当您编写自己的正则表达式来进行解析时,您正在使用您必须自己编写、测试和调试的代码。为什么您不想使用许多人多年来一直使用的工具?你认为你自己可以在飞行中做得更好吗?

于 2012-12-28T20:45:07.423 回答
2

我会使用 DOM,因为如果对页面进行任何小的更改,它就不太可能中断。

于 2011-08-15T16:08:56.693 回答