Когда-то давно писал «автолинковку» - т.е. подсвечивал слова линками а не спанами. Если нужна подстветка - можно просто заменить 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; // вернем ПЕРЕКОЛБАШЕНЫЙ текст }