![]() |
|
![]() ![]() ![]() |
|
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: нет Всего: 51 |
Скажу сразу, с Руби столкнулся всего пару дней назад и не по велению души, а по необходимости.
Задача, по-видимому, тривиальная. Дано: на входе строка(содержащая в себе фрагмент html). Нужно заменить все упоминания текста "а" на "@", не изменяя html-тэги. Например, есть текст:
Нужно чтобы замена произошла только в тексте, не изменяя тэги. Т.е. чтобы Header 1 => He@der 1 Header 2 => He@der 2 Some another text; -> Some @nother text; another link -> @nother link Как такое сделать правильно (желательно стандартными средствами Ruby + Rails + регулярки)? |
|||
|
||||
source777 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 6 Всего: 56 |
Задача вообще-то довольно сложная, если решать её одним регулярным выражением. Но в Ruby решается довольно просто, т.к. gsub может принимать блок:
На выходе:
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
||||
|
|||||
Bose |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: нет Всего: 51 |
source777, спасибо за ответ. Он мне действительно помог.
Я не очень точно сформулировал задачу. Это необязательно должно быть регулярное выражение. Просто насколько я понимаю, с регулярками такое сделать проще всего. Очень важное уточнение (сорри, я облажался, что не упомянул о нём когда задавал вопрос): с найденным текстом, не являющимся тегом нужно провести несколько операций замены. Пока что я сделал так (признаюсь, что большая часть кода - это copy&paste, и некоторых вещей я ещё не понимаю. Например - зачем нужна собачка перед @my_rules):
Правила по замене у меня пока хранятся в массиве. (когда научусь , я их буду загружать из БД). По ходу тестирования появились ещё 2 вопроса: 1) Не будет ли эффективнее поменять циклы замены местами? Чтобы сначала происходил поиск текста по />.*?</ а уже потом, цикл по элементам массива? Если да, то как такое сделать? ![]() 2) Как сделать, чтобы поиск текста из my_rule[0] был нечувствительным к РеГистру? (case insensitive)? Избавится от чувствительности к Регистру я смог, только заменив текст в массиве с 'redmin' на /redmine/i но это мне кажется неудобным. Есть ли какой способ добавить опцию /i на лету? Или отключить чувствительность к регистру только для этой замены (не глобально)?
|
||||
|
|||||
source777 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 6 Всего: 56 |
gsub может принимать для поиска как строку, так и регулярное выражение:
Возможно и будет, benchmark тебе в помощь. Несколько замен можно сделать прямо в блоке, передаваемом gsub, главное чтобы блок возвращал итоговый результат. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Ruby: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |