Автолинковка или Автоподсветка в HTML-коде

Когда-то давно писал «автолинковку» - т.е. подсвечивал слова линками а не спанами. Если нужна подстветка - можно просто заменить a на span.

Нужно заметить, что на больших объемах текста функция работает достаточно медленно.

//  В функцию приходит html-страница, или ее часть.
function smart_parse($str) {
 
 global $DB;  // давно это было - еще под php4 
    $sql="SELECT a.name AS NAME,
      a.url AS URL, s.site_id AS SITE,
          a.vis as VISIBLE
              FROM autolink a
                  INNER JOIN autolink2site s
                  ON s.link_id=a.id
WHERE length(a.url)>0 and s.site_id='".SITE_ID."'";
 
//SQL-запросом получаем список слов, URL-ов на которые их линковать и видимость ссылки 
//При обычной подстветке будет достаточно только списка слов.
//Думаю SQL-запрос не представляет интереса, но оставил - чтобы исключить неоднозначности
 
        $res=mysql_query($sql,$DB->db_Conn);
        $ar1=$ar=array();
        while($r=mysql_fetch_assoc($res)){
 
// VISIBLE - прятать ссылку от людей (CSS-наследование)
 
        if(intval($r['VISIBLE'])==1){
         $class='class="auto2"'; // не прячем
         }else{
         $class='class="autolink"'; // полностью наследуем CSS-родителей (уже не помню как, но задолбался)
         }
 
        $ar1[]='<a '.$class.' style="text-decoration: none; color:#686868;" href="'.$r['URL'].'" >$1</a>'; // определение замены
        $ar[]='#('.$r['NAME'].')#is';  // определение строки поиска
 
// все это складывается в два массива
 
        }
/*****************************************************************/
// Делим содержимое страницы на части
        $regexp='#\<[^\>]*?\>#is';
                $text= preg_split($regexp, $str);/
// size  - сколько тегов по которым мы делили страницу
        $size = preg_match_all($regexp, $str, $matches);
 
        $res = ''; // конечный результат
 
/* 
   Дальше достаточно сложный оборот.
   прокручиваем массив очищенных от тегов кусков текста
*/  
        foreach($text as $key => $val) {
           $res .= preg_replace($ar, $ar1, $val); /// заменям/подсвечиваем/линкуем слова в текущем куске текста
 
            if ($key != $size) { // мы достигли конца????
                $res .= $matches[0][$key];  // если нет - вернем на место теги, которые были после текущего куска текста
            }
        }
        return $res;  // вернем ПЕРЕКОЛБАШЕНЫЙ текст
}
Последние изменения: %2010/%03/%22 %01:%Mar