[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Подскажите как быстрее разложить HTML?
lykoshko
Поставил себе задачку разобраться, что и как.
Навоял скриптик. С использованием cUrl благополучна тащу весь Html в переменную. Необходимые данные находятся примерно в середине.
у меня возникли вот какие мысли, чтоб вытащить их в массив.
1. substr с верху и снизу
2. strip_tags (но это еще под вопросом)
3. explode в массив
4. а потом trim, preg_replace, чтобы удалить излишние пробелы и переносы строк.

У меня возник вопрос, а не будет ли это долго выполнятся? может быть есть более скоростные методы? rolleyes.gif
з.ы ну и на засыпку, а как быть, если захочется оставить ссылки?
____
з.ы.ы может быть задать этот вопрос в другом разделе?



Спустя 4 часа, 22 минуты, 42 секунды (19.09.2009 - 08:51) glock18 написал(а):
Более скоростные - это не используя регулярки как минимум.
А скорость - зависит от того для каких целей и как часто будет выполняться скрипт.

Если захочется оставить ссылки, то придется отказаться от strip_tags, очевидно.

какого рода поиск по тексту нужен?

Спустя 2 часа, 52 минуты, 3 секунды (19.09.2009 - 11:43) FatCat написал(а):
Самый быстрый алгоритм, увы, довольно геморройный. Особенно, если нужно тащить независимо от регистра.
Последовательность действий:
1. Копируем текст в нижнем регистре:
PHP
$txt_l strtolower($txt);

2. Операторами strpos и substr по переменной $txt_l находим искомые объекты и заносим в массив позиции начала и конца каждого искомого объекта.
3. Посредством substr нарезаем искомые объекты из $txt.

Спустя 2 часа, 29 минут, 15 секунд (19.09.2009 - 14:12) lykoshko написал(а):
проблема в том, что текст, который надо тянут изменяется каждый день и размер его тоже разный, поэтому перед тем как использовать регулярки надо обрезать.

Спустя 2 часа, 1 минута, 10 секунд (19.09.2009 - 16:13) FatCat написал(а):
Приведу для примера код функции "зазеркаливания" нашего движка форума: при первом просмотре страницы основного форума через зеркало, на зеркале заполняется форумная БД, чтобы при повторных запросах этой же страницы отображать данные уже из своей базы, не ломясь по HTTP на основной.
Естественно совершенно, что топики делаются только для четния, писать можно только на основном.

Вот код парсинга страницы темы:
Свернутый текст
PHP
// Если страница топика, парсим в таблицы топиков и сообщений; заодно и мемберов не забываем
            
if(stristr($ibforums->input['url'],"showtopic="))
            {
                
// Дербаним навстрип:
                
$nav explode("<img src='style_images/1/nav.gif' border='0'  alt='&gt;' />",$html);
                
$nav $nav[1];
                
$nav explode("</div>",$nav);
                
$nav explode("<a href='",$nav[0]);
                
$i 0;
                foreach(
$nav as $item)
                {
                    
$parent_id = -1;
                    
$url substr($item,0,strpos($item,"'"));
                    
$name stristr($item,'>');
                    
$name substr($name,1,(strpos($name,"</a>")-1));
                    if(
$i==2)
                    {
                        
$url intval(substr(stristr($url,"showforum="),10));
                        if(
$url)
                        {
                            
$DB->query("SELECT * FROM ibf_categories WHERE id = ".$url);
                            if ( ! 
$DB->get_num_rows() )$DB->query("INSERT INTO ibf_categories ( id , name , state ) VALUES ('".$url."', '".$name."', '1' )");
                            else 
$DB->query("UPDATE ibf_categories SET name = '".$name."', state = '1' WHERE id = ".$url);
                            
$cat_id $url;
                        }
                    }
                    if(
$i==3)
                    {
                        
$url intval(substr(stristr($url,"showforum="),10));
                        if(
$url and $cat_id)
                        {
                            
$DB->query("SELECT * FROM ibf_forums WHERE id = ".$url);
                            if ( ! 
$DB->get_num_rows() )$DB->query("INSERT INTO ibf_forums ( id , name , category, read_perms, prune, parent_id ) VALUES ('".$url."', '".$name."', '".$cat_id."', '*', '100', '-1' )");
                            else 
$DB->query("UPDATE ibf_forums SET name = '".$name."', category = '".$cat_id."', read_perms = '*', prune = '100', parent_id = '-1' WHERE id = ".$url);
                            
$forum_id $url;
                            
$parent_id $url;
                        }
                    }
                    if(
$i==4)
                    {
                        
$url intval(substr(stristr($url,"showforum="),10));
                        if(
$url and $cat_id)
                        {
                            
$DB->query("SELECT * FROM ibf_forums WHERE id = ".$url);
                            if ( ! 
$DB->get_num_rows() )$DB->query("INSERT INTO ibf_forums ( id , name , category, read_perms, prune, parent_id ) VALUES ('".$url."', '".$name."', '".$cat_id."', '*', '100', '".$parent_id."' )");
                            else 
$DB->query("UPDATE ibf_forums SET name = '".$name."', category = '".$cat_id."', read_perms = '*', prune = '100', parent_id = '".$parent_id."' WHERE id = ".$url);
                            
$forum_id $url;
                        }
                    }
                    
$i++;
                }
                
                
// Парсим таблицу топиков
                
$t intval(substr(stristr($ibforums->input['url'],"showtopic="),10));
                
$title stristr($html,"<td width='99%' style='word-wrap:break-word;'>");
                
$title explode("</div>",$title);
                
$title $title[0];
                
$title explode("<b>",$title);
                
$title $title[1];
                if( 
stristr($title,"</b>, ") )
                {
                    
$title explode("</b>, ",$title);
                    
$description $title[1];
                    
$title $title[0];
                }
                else
                {
                    
$title str_replace("</b>","",$title);
                    
$description "";
                }
                
                
                if(
$t)
                {
                    
$DB->query("SELECT * FROM ibf_topics WHERE tid = ".$t);
                    if ( ! 
$DB->get_num_rows() )$DB->query("INSERT INTO ibf_topics (tid, title, description, forum_id, approved, last_post) VALUES ('".$t."', '".$title."', '".$description."', '".$url."', '1', '1' )");
                    else 
$DB->query("UPDATE ibf_topics SET title = '".$title."', description = '".$description."', forum_id = '".$url."', approved = '1', last_post = '1' WHERE tid = ".$t);
                }
                
                
// Пошли парсить посты
                
$posts explode('<a name="entry',$html);
                unset(
$posts[0]);
                foreach(
$posts as $post)
                {
                    
$member_id 0;
                    
$pid intval($post);
                    if(
stristr($post,'<span class="unreg">'))
                    {
                        
$member_name explode('<span class="unreg">',$post);
                        
$member_name $member_name[1];
                        
$member_name explode('</span>',$member_name);
                        
$member_name $member_name[0];
                    }
                    else
                    {
                        
$member_name stristr($post,"showuser=");
                        
$member_name explode('</a>',$member_name);
                        
$member_name $member_name[0];
                        
$member_name substr($member_name,9);
                        
$member_name explode("'>",$member_name);
                        
$member_id intval($member_name[0]);
                        
$member_name $member_name[1];
                    }
                    if(
stristr($post,"style_images/1/to_post_off.gif' alt='сообщение' border='0' style='padding-bottom:2px' />"))
                        
$time stristr($post,"style_images/1/to_post_off.gif' alt='сообщение' border='0' style='padding-bottom:2px' />");
                    else
                        
$time stristr($post,'style_images/1/to_post_off.gif" style="padding-bottom:2px" border="0">');
                    
$time explode(">",$time);
                    
$time $time[1];
                    
$time explode("<",$time);
                    
$time trim($time[0]);
                    
$d_now date("d.m.Y");
                    
$time str_replace("Сегодня",date("d.m.Y"),$time);
                    if(
stristr($time,"Вчера"))
                    {
                        
$time str_replace("Вчера",date("d.m.Y"),$time);
                        
$correct_day 1;
                    }
                    else
                    {
                        
$correct_day 0;
                    }
                    
$time str_replace(":",".",$time);
                    
$time str_replace(", ",".",$time);
                    
$time explode(".",$time);
                    
$time mktime$time[3],$time[4],0,$time[1],$time[0],$time[2] );
                    
$time $time 86400*$correct_day;
                    
                    
$post stristr($post,"view=findpost");
                    
$post stristr($post,'<span class="postdetails">');
                    
                    
$avatar explode('<br /><br />',$post);
                    
$avatar $avatar[0];
                    if(
stristr($avatar,'<img src='))
                    {
                        
$avatar explode("<img src='",$avatar);
                        
$avatar $avatar[1];
                        
$avatar explode("'",$avatar);
                        
                        
$avatar_url $avatar[0];
                        
$avatar_ext explode(".",$avatar[0]);
                        
$avatar_ext $avatar_ext[(count($avatar_ext)-1)];
                        
//copy($avatar_url, $_SERVER['DOCUMENT_ROOT']."/uploads/av-".$member_id.".".$avatar_ext);
                        
if(!stristr($avatar_url,"http://"))$avatar_url $parsed_domen.'/'.$avatar_url;
                        
$this->url($avatar_url$_SERVER['DOCUMENT_ROOT']."/uploads/av-".$member_id.".".$avatar_ext);
                        
$avatar "upload:av-".$member_id.".".$avatar_ext;
                    }
                    else
                    {
                        
$avatar "noavatar";
                    }
                    if(
stristr($post,'<div class="signature">'))
                    {
                        
$signature explode('<div class="signature">',$post);
                        
$signature $signature[1];
                        
$signature explode('</div>',$signature);
                        
$signature $signature[0];
                    }
                    else
                    {
                        
$signature "";
                    }
                    
$post explode('<div class="postcolor" id=',$post);
                    
$post $post[1];
                    
$post substr($post,(strpos($post,'>')+1));
                    
$post explode('<!--IBF.ATTACHMENT_',$post);
                    
$post trim($post[0]);
                    
// Совместимость с 1.х:
                    
$post str_replace("<br />","<br>",$post);
                    if(
$member_id)
                    {
                        
$DB->query("SELECT * FROM ibf_members WHERE id = ".$member_id);
                        if ( ! 
$DB->get_num_rows() )$DB->query("INSERT INTO ibf_members (id, name, avatar, signature) VALUES ('".$member_id."', '".addslashes($member_name)."', '".addslashes($avatar)."', '".addslashes($signature)."' )");
                        else 
$DB->query("UPDATE ibf_members SET name = '".addslashes($member_name)."', avatar = '".addslashes($avatar)."', signature = '".addslashes($signature)."' WHERE id = ".$member_id);
                    }
                    
                    
// Сразу архивачим посты:
                    
if(strlen($post)>4000)
                    {
                        
$std->create_archived_post($pid"arc"$post);
                        
$post " ";
                    }
                    
                    
$DB->query("SELECT * FROM ibf_posts WHERE pid = ".$pid);
                    if ( ! 
$DB->get_num_rows() )$DB->query("INSERT INTO ibf_posts 
                    (pid, author_id, author_name, post_date, post, topic_id, forum_id, queued, use_sig, use_emo) VALUES 
                    ('"
.$pid."', '".$member_id."', '".addslashes($member_name)."', '".$time."', '".addslashes($post)."', '".$t."', '".$forum_id."', '0', '1', '1' )");
                    else 
$DB->query("UPDATE ibf_posts SET author_id = '".$member_id."', author_name = '".addslashes($member_name)."', post_date = '".$time."', post = '".addslashes($post)."', topic_id = '".$t."', forum_id = '".$forum_id."', queued = '0', use_sig = '1', use_emo = '1' WHERE pid = ".$pid);
                }
                
// Отпарсили посты, пошли дополнять таблицу топиков:
                
$err 0;
                if(
$t)
                {
                
$DB->query("SELECT MIN( pid ) AS minpid, MAX( pid ) AS maxpid, count( pid ) AS cpid FROM ibf_posts WHERE topic_id = ".$t);
                    
$row $DB->fetch_row();
                    
$minpid $row['minpid'];
                    
$maxpid $row['maxpid'];
                    
$posts intval($row['cpid'])-1;
                }
                else
                {
                    
$err++;
                }
                if(
$minpid)
                {
                
// Старт топика:
                    
$DB->query("SELECT author_id, post_date, author_name FROM ibf_posts WHERE pid = ".$minpid);
                    
$row $DB->fetch_row();
                    
$starter_id $row['author_id'];
                    
$start_date $row['post_date'];
                    
$starter_name $row['author_name'];
                }
                else
                {
                    
$err++;
                }
                if(
$maxpid)
                {
                
// Финиш топика:
                    
$DB->query("SELECT author_id, post_date, author_name FROM ibf_posts WHERE pid = ".$maxpid);
                    
$row $DB->fetch_row();
                    
$last_poster_id $row['author_id'];
                    
$last_post $row['post_date'];
                    
$last_poster_name $row['author_name'];
                }
                else
                {
                    
$err++;
                }
                
// Сохраняем:
                
if(!$err)$DB->query("UPDATE ibf_topics SET posts = '".$posts."', starter_id = '".$starter_id."', start_date = '".$start_date."', 
                starter_name = '"
.$starter_name."', last_poster_id = '".$last_poster_id."', last_post = '".$last_post."', last_poster_name = '".$last_poster_name."'
                WHERE tid = "
.$t);
                if(
$err and !$status)$status 12345;
            }

Спустя 1 час, 55 минут, 43 секунды (19.09.2009 - 18:09) lykoshko написал(а):
спасибо. буду копать.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.