Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заменить все вхождения,кроме тех,что между тегами 
V
    Опции темы
yorc
Дата 26.1.2010, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 26.12.2009

Репутация: нет
Всего: нет



привет всем!

поиск дал мне одну ветку, похожую на мой случай, но не совсем: http://forum.vingrad.ru/topic-279589.html

поэтому всё же попытаюсь сформулировать вопрос.
есть строка $st и есть хэш %k, в котором содержится список слов, которые нужно заменить на специфического вида ссылки (причём ВСЕ их вхождения в строку!)

написал вот такой код:

Код

        my $st = "some text about some shit";
        foreach (sort {$k{$b} <=> $k{$a}} keys %k) {
         my $wt = $_;
         $wt =~ s/\s+/\_/g;
         my $newst = "<b><a href=\"http\:\/\/URL\/$wt\" ".
                     "title=\"smth\" target=_blank>$_</a></b>";
         my $newpos = 0;
         while ((my $pos = index $st, $_, $newpos) >= 0) {
             my $ts = substr $st, $pos, length($_), $newst;
             $newpos = $pos + length($newst);
         }
        }


подозреваю, что он, мягко говоря, не самый оптимальный... да и работает плоховато :(
дело в том, что зачастую после нескольких проходов в тексте, который УЖЕ содержит ссылки, очередное слово из массива обнаруживается МЕЖДУ ТЕГАМИ уже сформированной ссылки!
в связи с этим вопрос: как можно это всё переписать более грамотно с помощью регекспов и, самое главное, как сделать так, чтобы слово НЕ заменялось на ссылку, если оно найдено МЕЖДУ существующими тегами <a></a> ?

всем заранее спасибо за помощь!
PM MAIL   Вверх
sir_nuf_nuf
Дата 26.1.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



Код

my $str = "bla blo ble";
my %data = (bla => 'ya.ru', blo => 'mail.ru', ble => 'go.ru');
my $regex = join '|', map {quotemeta($_)} keys %data;
$str =~ s[($regex)][<a href="http://$data{$1}/" target="_blank">link</a>]g;
print $str;


Как то так

Это сообщение отредактировал(а) sir_nuf_nuf - 26.1.2010, 11:46


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
yorc
Дата 26.1.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 26.12.2009

Репутация: нет
Всего: нет



спасибо огромное!!!
немного исправил, но заработало! обожаю регекспы - только бы ещё научиться их понимать...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.1198 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.