Есть ли способ оптимизировать поиск текстовых элементов на странице (не регулярное выражение) - PullRequest
0 голосов
/ 06 мая 2010

Увидев, как несколько потоков копируют метод regexp, чтобы найти термин для сопоставления в документе HTML, я использовал PHP-синтаксический анализатор Simple HTML DOM (http://simplehtmldom.sourceforge.net/), чтобы получить фрагменты текста, которые мне нужны, но я хочу знать, является ли мой код оптимальным. Такое ощущение, что я зацикливаюсь слишком много раз. Есть ли способ оптимизировать следующий цикл?

//Get the HTML and look at the text nodes
   $html = str_get_html($buffer);
   //First we match the <body> tag as we don't want to change the <head> items
   foreach($html->find('body') as $body) {
    //Then we get the text nodes, rather than any HTML
    foreach($body->find('text') as $text) {
     //Then we match each term
     foreach ($terms as $term) {
      //Match to the terms within the text nodes
      $text->outertext = str_replace($term, '<span class="highlight">'.$term.'</span>', $text->outertext);
     }       
    }
   }

Например, будет ли важно определить, есть ли у меня совпадения, прежде чем я начну цикл?

Ответы [ 2 ]

0 голосов
/ 06 мая 2010

Говоря по незнанию, find принимает произвольные выражения XPath? Если это так, вы можете сложить две внешние петли в одну:

foreach($html->find('body/text') as $body) {
    ...
}
0 голосов
/ 06 мая 2010

Вам не нужен внешний цикл foreach; в правильно сформированном документе обычно есть только один тег body. Вместо этого просто используйте $body = $html->find('body',0);.

Однако, поскольку цикл с единственной итерацией по существу эквивалентен во время выполнения тому, чтобы вообще не выполнять цикл, он, вероятно, не окажет большого влияния на производительность в любом случае. Так что на самом деле у вас действительно есть 2 вложенных цикла даже в исходном коде, а не 3.

...