加载时间:使用PHP的DOMDocument解析HTML还是使用正则表达式更快?

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;

我听到小马托尼的脚步声正在靠近... - Brian Driscoll
1
你为什么要问我们呢?你已经有了代码,所以使用一款分析器和基准测试工具吧。 - Gordon
基准测试,基准测试,基准测试。对于简单的模式来说,正则表达式可能会更快,但DOM会更加可靠。但这完全取决于您的正则表达式有多复杂以及DOM树有多么复杂。只有您自己才能确定哪种方法在总体上更好/更快。 - Marc B
1
你可以通过使用XPath来大幅减少DOM代码的量。 - Gordon
1
为什么你不直接使用API而非进行屏幕抓取?????? - prodigitalson
完全不熟悉Flickr API。 - bozdoz
2个回答

3
如果你愿意为了正确性而牺牲速度,那么可以尝试使用正则表达式自己编写解析器。
你说:“个人而言,我发现通过DOM解析HTML更加复杂。”你是在优化结果的正确性还是你编写代码的易用性?
如果你只想要速度和简单的代码,为什么不直接使用这个呢:
$array_of_photos = Array( 'booger.jpg', 'aunt-martha-on-a-horse.png' );

或者只是

$array_of_photos = Array();

这些算法运行时间恒定,易于理解。没问题,对吧?

什么?你想要准确的结果?那就不要使用正则表达式解析HTML

最后,当你使用像DOM这样的解析器时,你正在使用经过多年测试和调试的代码。 当你编写自己的正则表达式来进行解析时,你正在使用需要自己编写、测试和调试的代码。 为什么不想使用许多人多年来一直在使用的工具呢? 你认为自己能够在现场做得更好吗?


谢谢Andy。这个问题是基于一个客户网站的,但最终被放弃了。我同意DOM解析原则上比正则表达式更好。 - bozdoz

2

我会使用DOM,因为如果页面进行任何小的更改,这种方法不太可能出现问题。


1
我的 DOM 代码不会因为外部页面的更改而轻易破坏吗? - bozdoz
1
不是所有的更改都会导致问题... 例如,如果标签中的空格稍微改变,或者如果在class属性中添加了类名,或者如果标签上的属性顺序发生了变化,你的正则表达式可能会出错。使用DOM和XPath几乎可以避免所有这些问题。 - prodigitalson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接