Индексация страниц, выделение значимой части.

WP

^_^
Индексация страниц, выделение значимой части.

Робот который обрабатывает страницы должен сохранить текст страницы в базу для дальнейшего поиска по ней. Встал вопрос об очистке HTML-кода. На данных момент он подвергается следующей обработке:
PHP:
$text = preg_replace('~<style[^>]*>.*?</style>~si','',$text);
$text = preg_replace('~<script[^>]*>.*?</script>~si','',$text);
$text = preg_replace('~<select[^>]*>.*?</select>~si','',$text);
$text = str_replace('~&nbsp;~',' ',$text);
$text = strip_tags($text,'<a>');
Дело в том что многое не нужно записывать, например показания счетчика посещений, и т.д. Возникла идея заключать значимую часть (ссылки, тексты статей, и т.д.) в специальный парный тэг, и сохранять только то что внутри него.

Какой способ лучше? Спасибо.
 

DiMA

php.spb.ru
Команда форума
детский сад, 3 preg_replace объедини в один. У меня в примере тоже реги можно укоротить, но было влом.

на самом деле их не 3, а больше

интересно, селект-то чем не угодил

да и вообще нифига не продумана индексация

спец. теги тебе инет не даст, а простой способ - проиндексировать все страницы одного сайта (либо одного раздела на сайте), найти повторяющиеся блоки слов большой длины (либо только с начала и конца) и удалить их все, кроме одной страницы

PHP:
function html2fulltext($buf) {

    $moreword=array();
    preg_match_all("!<meta[^>]+name[ \r\n\t]*=[ \r\n\t]*([\"']?)description\\1[^>]*content[ \r\n\t]*=[ \r\n\t]*'([^>']*)'[^>]*>!is",$buf,$ok);
    if (count($ok[2])) foreach ($ok[2] as $k=>$v) $moreword[sl($v)]=$v;
    preg_match_all("!<meta[^>]+name[ \r\n\t]*=[ \r\n\t]*([\"']?)description\\1[^>]*content[ \r\n\t]*=[ \r\n\t]*\"([^>\"]*)\"[^>]*>!is",$buf,$ok);
    if (count($ok[2])) foreach ($ok[2] as $k=>$v) $moreword[sl($v)]=$v;

    preg_match_all("!<meta[^>]+name[ \r\n\t]*=[ \r\n\t]*([\"']?)keywords\\1[^>]+content[ \r\n\t]*=[ \r\n\t]*'([^>']*)'[^>]*>!is",$buf,$ok);
    if (count($ok[2])) foreach ($ok[2] as $k=>$v) $moreword[sl($v)]=$v;
    preg_match_all("!<meta[^>]+name[ \r\n\t]*=[ \r\n\t]*([\"']?)keywords\\1[^>]+content[ \r\n\t]*=[ \r\n\t]*\"([^>\"]*)\"[^>]*>!is",$buf,$ok);
    if (count($ok[2])) foreach ($ok[2] as $k=>$v) $moreword[sl($v)]=$v;

    preg_match_all("!<\w{1,20}[^>]+(?:alt|title)[ \r\n\t]*=[ \r\n\t]*([^\r\n\t <>'\"]*)!is",$buf,$ok);
    if (count($ok[1])) foreach ($ok[1] as $k=>$v) $moreword[sl($v)]=$v;
    preg_match_all("!<\w{1,20}[^>]+(?:alt|title)[ \r\n\t]*=[ \r\n\t]*'([^>']*)'!is",$buf,$ok);
    if (count($ok[1])) foreach ($ok[1] as $k=>$v) $moreword[sl($v)]=$v;
    preg_match_all("!<\w{1,20}[^>]+(?:alt|title)[ \r\n\t]*=[ \r\n\t]*\"([^>\"]*)\"!is",$buf,$ok);
    if (count($ok[1])) foreach ($ok[1] as $k=>$v) $moreword[sl($v)]=$v;

    if (count($moreword)) foreach ($moreword as $k=>$v) $buf.=" $v";

    $buf=preg_replace("!<(script|applet|embed|style|iframe|object|frameset|frame|noscript).*?</\\1>!is","",$buf);
    $buf=str_replace("<"," <",$buf);
    $buf=str_replace(">","> ",$buf);
    $buf=strip_tags($buf);
    $buf=str_replace(" | "," ",$buf);
    $buf=preg_replace("!\[(".pall."+)\]!","\\1",$buf);
    $buf=preg_replace("!&nbsp;!i"," ",$buf);
    $buf=preg_replace("!&laquo;!i","\"",$buf);
    $buf=preg_replace("!&raquo;!i","\"",$buf);
    $buf=preg_replace("!&(lt|gt|copy|quot|amp|[lr]s?aquo|mdash|minus|plus|middot|#\d+);!i"," ",$buf);
    $buf=preg_replace("!&\w{2,8};!i"," ",$buf);
    $buf=preg_replace("![ \r\n\t\\xA0]+!is"," ",$buf);
    $buf=preg_replace("![\\x00-\\x1F]!is","",$buf);

    return $buf;
}
 

WP

^_^
Я пока думаю над алгоритмом самим, а реги потом оптимальные сделаю. Теги могу сам сделать т.к. индексируется собственный сайт. Селект не угодил тем что там много лишнего. Спасибо.
 

SelenIT

IT-лунатик :)
WP
> индексируется собственный сайт.
Может, в таком случае рациональнее и индексировать инфу до вывода страниц, а не гонять паука с нетривиальным парсингом?
 

WP

^_^
SelenIT
Возможность поиск непосредственно по БД тоже есть, но паук необходим чтобы он захватывал элементы из шаблонов, например набираешь в поиск "автор вася пупкин", и по паучковой БД находится страница со статьей этого автора. В системе много модулей, и хотелось бы автоматизировать поиск по всему сайту, но это не связано с выборкой нужного по БД (например товара, или сообщения на форуме).
 

SelenIT

IT-лунатик :)
Тогда, согласен, паук рациональнее. Может, есть смысл натравливать его на вариант страницы с минимумом незначащей информации, а-ля версия для печати?
 

WP

^_^
SelenIT
Тоже об этом подумал =)
PHP:
if (preg_match('~0xEngineBot~i',$_SERVER['HTTP_USER_AGENT']))...
:)
 
Сверху