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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> замена содержимого между тегами, новичОК 
:(
    Опции темы
ImSave
Дата 10.11.2009, 14:20 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет. Подскажите новичку пожалуйста.
В переменной $c_cont содержится текст вида:
Код

..бла бла бла.. ... <a  бла бла1 </a>.... <a бла бла2 </a>...

нужно текст между всеми тегами <a ...</a> заменить на слово: ссылка
т.е. должно получится
Код

..бла бла бла.. ... <a ссылка </a>.... <a ссылка </a>...

PM MAIL   Вверх
Pfailed
Дата 10.11.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что может быть проще
Код

s@(?<=<a ).+?(?= </a>)@ссылка@gs



--------------------
PM MAIL   Вверх
sir_nuf_nuf
Дата 10.11.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



как же всем нравится использовать всякие символы за место слешей в качесве разделителей реджексов...
жаль вим тупит на таких конструкциях


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


Опытный
**


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

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



Я обычно использую слеши. Но когда сами слеши встречаются в выражении, то дабы не плодить частокол, очевидно есть резон воспользоваться альтернативными разделителями.


--------------------
PM MAIL   Вверх
ImSave
Дата 10.11.2009, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Pfailed @ 10.11.2009,  16:13)
Что может быть проще
Код

s@(?<=<a ).+?(?= </a>)@ссылка@gs

Спасибо! 
а т.к. может встречаться и <A ...</A> 
то правильнее и быстрее ли будет вместо этих двух строк:
Код

my $c_cont = s@(?<=<a ).+?(?= </a>)@ссылка@gs
my $c_cont = s@(?<=<А ).+?(?= </А>)@ссылка@gs

использовать:
Код

my $c_cont = s@(?<=<[Aa] ).+?(?= </[Aa]>)@ссылка@gs

??
PM MAIL   Вверх
Pfailed
Дата 10.11.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В таком случаи я бы сделал так:
Код

s@(?<=<a ).+?(?= </a>)@ссылка@gsi


модификатор i - игнорировать регистр.


--------------------
PM MAIL   Вверх
krypt3r
Дата 11.11.2009, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



И что вы этим кодом
Код

my $c_cont = s@(?<=<А ).+?(?= </А>)@ссылка@gs

получите? В переменной $c_cont у вас будет число произведенных замен в переменной $_. Поставьте тильду после знака равенства
PM MAIL   Вверх
Bulat
Дата 11.11.2009, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Цитата(Pfailed @  10.11.2009,  18:05 Найти цитируемый пост)
Я обычно использую слеши. Но когда сами слеши встречаются в выражении, то дабы не плодить частокол, очевидно есть резон воспользоваться альтернативными разделителями. 


Разве что символ '@' - не самый приятный разделитель. ИМХО, есть фигурные скобки. smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
ImSave
Дата 11.11.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(krypt3r @ 11.11.2009,  07:09)
И что вы этим кодом
Код

my $c_cont = s@(?<=<А ).+?(?= </А>)@ссылка@gs

получите? В переменной $c_cont у вас будет число произведенных замен в переменной $_. Поставьте тильду после знака равенства

Код

my $c_cont =~ s@(?<=<А ).+?(?= </А>)@ссылка@gs

оно?

Добавлено через 6 минут и 4 секунды
Цитата(Bulat @ 11.11.2009,  09:04)
Разве что символ '@' - не самый приятный разделитель. ИМХО, есть фигурные скобки. smile

у вас есть другое предложение?
можете пример для моего случая показать?
PM MAIL   Вверх
krypt3r
Дата 11.11.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если у вас исходный текст находится в переменной $c_cont, то Pfailed уже написал, как делается
Код

$c_cont =~ s@(?<=<a ).+?(?= </a>)@ссылка@gsi;

Какой символ юзать, имхо, без разницы. Кому как нравится. В "классическом написании" будет так
Код

$c_cont =~ s/(?<=<a ).+?(?= <\/a>)/ссылка/gsi;

С фигуристыми скобками =)
Код

$c_cont =~ s{(?<=<a ).+?(?= </a>)}{ссылка}gsi;



Это сообщение отредактировал(а) krypt3r - 11.11.2009, 14:03
PM MAIL   Вверх
ImSave
Дата 12.11.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо всем огромное! все получилось.
только перед </a> не должно быть пробела
т.е.
Код

s@(?<=<a ).+?(?=</a>)@ссылка@gsi;


и еще вопросик.
Это оптимальный вариант в плане скорости???
PM MAIL   Вверх
Bulat
Дата 13.11.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Цитата(ImSave @  12.11.2009,  15:15 Найти цитируемый пост)
только перед </a> не должно быть пробела

пробелы я советовал бы обрабатывать через \s*. По своему опыту - это такой хитрый символ, что иной раз встречается там где казалось бы быть не должен, или наоборот, может и не оказаться где ожидалось.  smile

Добавлено через 1 минуту и 3 секунды
А еще бывает, что иногда вместо одного пробела, иной раз может оказаться больше smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
amg
Дата 13.11.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(ImSave @  12.11.2009,  15:15 Найти цитируемый пост)
Это оптимальный вариант в плане скорости???
Скорее всего, быстрее (но вряд ли сильно) будет вариант без использования заглядываний внеред/назад:
Код
$c_cont =~ s|<a\s.+?</a>|<a ссылка</a>|gsi;


PM MAIL   Вверх
ImSave
Дата 13.11.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ок. Попробую.
А можете привести ф-ю с помощью которой можно сравнить скорость работы этого. Ну типа:
Код

print TimeStart();
$c_cont =~ s|<a\s.+?</a>|<a ссылка</a>|gsi;
print TimeStop();

до миллисекунд желательно...ну или как еще сравнить скорость выполнения этих вариантов.
PM MAIL   Вверх
ginnie
Дата 13.11.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



ImSave, попробуй

Код

use Time::HiRes 'time';

print time(), $/;


Но не думаю, что разница будет заметной.

Это сообщение отредактировал(а) ginnie - 13.11.2009, 13:54


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


 




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


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

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