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

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

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

Какое здесь может быть решение?
 
GusarByID если сразу то на ум приходит strip_tags

-~{}~ 06.05.08 15:16:

После подсветки строки ссылки должны оставаться?
 
Должны, в том то и проблема.

Мне кажется я нашел решение:
ссылки - php
поиск - javascript
 
О, это как?
И вдогонку вопрос, ссылки могут рваться подсветкой?
 
хм, а почему сразу не подсветить, а после вставить ссылки
интересно посомтреть как будет выглядеть неправильная вложенность
что за хрень с редактированием поста
 
AmdY Должна выглядеть так: <a >l < b > ol </b> </ a ><b>lol</b>
Вот только как это регулярками все учесть. HEm наверно подскажет.
 
GusarByID Алгоритм то простой, если делать все на PHP. Если надо могу набросать. Но вот мне все же интересно именно регулярками.
 
я думаю html это переварит, хотя можно и починить.
у меня что-то Opera 9.50b2 заглючила, редактировал пост, а после редиректа ничего не менялось :( это пока первый глюк.
 
но починить не проблема, ищем <span>text<a> - меняем на <span>text</span><a><span> и т.д. хотя коравенько получается
 
извини, конкретно не подскажу, сам в регулярках не силен

уверен, что можно и уверен, что составить нужную регулярку будет крайне тяжело (как с ними обычно и бывает)
 
вот пример как ремонтировать
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);
 
Вообщем то, что приходит в голову следующий алгоритм:
На входе имеем:
- строку безо всяких тэгов;
- массив ссылок с указанием, где какие ссылки стоят (номер первого и последнего символа);
- Начало и конец подсвечиваемой строки.

Идем слева направо обрабатывая по одному символу.
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>";
Примерно так. :)
 
Сверху