Время загрузки: быстрее ли анализировать HTML с помощью DOMDocument PHP или с помощью регулярных выражений? - PullRequest
3 голосов
/ 15 августа 2011

Я перетаскиваю изображения из своей учетной записи Flickr на мой веб-сайт, и я использовал около девяти строк кода для создания функции preg_match_all, которая будет извлекать изображения.

Я несколько раз читал, что лучше разбирать HTML через DOM.

Лично мне было сложнее анализировать HTML через DOM. Я создал аналогичную функцию для извлечения изображений с помощью 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;

Ответы [ 2 ]

3 голосов
/ 29 декабря 2012

Если вы готовы пожертвовать скоростью ради правильности, тогда попробуйте запустить собственный синтаксический анализатор с регулярными выражениями.

Вы говорите: «Лично мне было сложнее анализировать HTML с помощьюDOM «.Вы оптимизируете для правильности результатов, или как легко вам написать код?

Если все, что вам нужно, это скорость и код, который не сложен, почему бы просто не использовать это:

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

или, может быть, просто

$array_of_photos = Array();

Они работают в постоянном времени, и их легко понять.Нет проблем, верно?

Что это?Вы хотите точные результаты?Тогда не анализируйте HTML с помощью регулярных выражений .

Наконец, когда вы работаете с синтаксическим анализатором, таким как DOM, вы работаете с фрагментом кода, который был хорошо протестировани отлажены годами.Когда вы пишете свои собственные регулярные выражения для анализа, вы работаете с кодом, который вам придется писать, тестировать и отлаживать самостоятельно.Почему вы не хотите работать с инструментами, которые многие люди используют в течение многих лет?Как вы думаете, вы можете сделать лучшую работу самостоятельно на лету?

2 голосов
/ 15 августа 2011

Я бы использовал DOM, так как с меньшей вероятностью он сломается, если на страницу будут внесены небольшие изменения.

...