Поиск в тексте со ссылками

GusarByID

Новичок
Поиск в тексте со ссылками

Прошу помощи!!!
Имеется очень длинное слово 40 000 и более знаков (цепочка нуклеотидов) выглядит так:

gcatgcctcttatccatttaaaaatagctttactgacctataatttacacactatataattctcccattgaaagtgcataattctgttgcttttagtatatttacagagttgtgcagcatcagcataat
gtaatctagaacattgtcatcaactacccccaaatctctattcttcccttcccctattaattacccagccccaggcaagcactgatctacttttggtctctatggatttgtctatttgtggacactttaaat
ggaatcatacaatatgtgtcttttgcgactatcttctttcacttatcataactcaatacggctttagattatttgacctcgatgttctgcctctgaacataaaatattatccttgcattccttgatgagtttg
aggattgagaataatttgcatgagacaaaaattagaaactagttagagcaagtaggcttttctccatcacataagctgatccatcttgccaatgttaaaacaccagattgtacaagcacaagctg
ggacgcaatgtgtgtccctctatccctacattgactttgcgggggtggggatggggtgcggggtgagtgagggaggactgcaagtgacaaac

Необходимо осуществлять поиск маленькой цепочки (до 50 символов) в этой большой с подсветкой найденной последовательности.
Это не составляет сложности. Проблема в том, что некоторые символы должны иметь ссылки на определенный ресурс.
в XML-файле имеются номера символов в последовательности, которые должны стать линками иногда это отдельные символы,
иногда группы по 2-5 знаков. С помощью substr_replace в цикле вставляются в текст теги ссылок,
но из-за этого текст соответственно меняется:

atttaca<a href.....>cac</a>tatataattctcccatt<a href.....>g</a>aaagtgcataattctgttgcttttag

и найти уже нужную последовательность невозможно если один из ее символов имеет ссылку.

Какое здесь может быть решение?
 

rotoZOOM

ACM maniac
GusarByID если сразу то на ум приходит strip_tags

-~{}~ 06.05.08 15:16:

После подсветки строки ссылки должны оставаться?
 

GusarByID

Новичок
Должны, в том то и проблема.

Мне кажется я нашел решение:
ссылки - php
поиск - javascript
 

rotoZOOM

ACM maniac
О, это как?
И вдогонку вопрос, ссылки могут рваться подсветкой?
 

AmdY

Пью пиво
Команда форума
хм, а почему сразу не подсветить, а после вставить ссылки
интересно посомтреть как будет выглядеть неправильная вложенность
что за хрень с редактированием поста
 

rotoZOOM

ACM maniac
AmdY Должна выглядеть так: <a >l < b > ol </b> </ a ><b>lol</b>
Вот только как это регулярками все учесть. HEm наверно подскажет.
 

rotoZOOM

ACM maniac
GusarByID Алгоритм то простой, если делать все на PHP. Если надо могу набросать. Но вот мне все же интересно именно регулярками.
 

AmdY

Пью пиво
Команда форума
я думаю html это переварит, хотя можно и починить.
у меня что-то Opera 9.50b2 заглючила, редактировал пост, а после редиректа ничего не менялось :( это пока первый глюк.
 

AmdY

Пью пиво
Команда форума
но починить не проблема, ищем <span>text<a> - меняем на <span>text</span><a><span> и т.д. хотя коравенько получается
 

HEm

Сетевой бобер
извини, конкретно не подскажу, сам в регулярках не силен

уверен, что можно и уверен, что составить нужную регулярку будет крайне тяжело (как с ними обычно и бывает)
 

AmdY

Пью пиво
Команда форума
вот пример как ремонтировать
PHP:
$test = "ttt<span>XXX<a href.....>Y</span>Z</a>ttt";
$test = preg_replace_callback('~<span>(.*)</span>~', "myfunction", $test);
function myfunction($match) {
return "<span>".preg_replace('(<a.*>)', "</span><a$1><span>", $match[1]) . "</span>";
}
echo htmlspecialchars($test);
 

rotoZOOM

ACM maniac
Вообщем то, что приходит в голову следующий алгоритм:
На входе имеем:
- строку безо всяких тэгов;
- массив ссылок с указанием, где какие ссылки стоят (номер первого и последнего символа);
- Начало и конец подсвечиваемой строки.

Идем слева направо обрабатывая по одному символу.
PHP:
// == $s - исходная строка
// == $d - результируюшая
$fl=false;
for ($i=0;$i<strlen($s);$i++){
    if (/* перед $i символом закрывается подсветка */){
        $d.="</b>";
        $fl=false;
    }
    if (/* перед $i символом заканчивается очередная ссылка*/){
        if ($fl)$d.="</b>";
        $d.="</a>";
        if ($fl)$d.="<b>";
    }
    if (/* перед $i символом начинается очередная ссылка*/){
        if ($fl)$d.="</b>";
        $d.="<a href>";
        if ($fl)$d.="<b>";
    }
    if (/* перед $i символом начинается выделенка */){
        $d.="<b>";
        $fl=true;
    }
}
if ($fl)$d.="</b>";
if (/* осталась открытая ссылка */)$d.="</a>";
Примерно так. :)
 
Сверху