| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Ruby: Общие вопросы > Как измененить все фрагменты найденные регуляркой? |
| Автор: Bose 23.10.2009, 16:44 | ||
| Скажу сразу, с Руби столкнулся всего пару дней назад и не по велению души, а по необходимости. Задача, по-видимому, тривиальная. Дано: на входе строка(содержащая в себе фрагмент 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 25.10.2009, 23:15 | ||||
Задача вообще-то довольно сложная, если решать её одним регулярным выражением. Но в Ruby решается довольно просто, т.к. gsub может принимать блок:
На выходе:
|
| Автор: Bose 26.10.2009, 02:25 | ||||
| source777, спасибо за ответ. Он мне действительно помог. Я не очень точно сформулировал задачу. Это необязательно должно быть регулярное выражение. Просто насколько я понимаю, с регулярками такое сделать проще всего. Очень важное уточнение (сорри, я облажался, что не упомянул о нём когда задавал вопрос): с найденным текстом, не являющимся тегом нужно провести несколько операций замены. Пока что я сделал так (признаюсь, что большая часть кода - это copy&paste, и некоторых вещей я ещё не понимаю. Например - зачем нужна собачка перед @my_rules):
Правила по замене у меня пока хранятся в массиве. (когда научусь , я их буду загружать из БД). По ходу тестирования появились ещё 2 вопроса: 1) Не будет ли эффективнее поменять циклы замены местами? Чтобы сначала происходил поиск текста по />.*?</ а уже потом, цикл по элементам массива? Если да, то как такое сделать? 2) Как сделать, чтобы поиск текста из my_rule[0] был нечувствительным к РеГистру? (case insensitive)? Избавится от чувствительности к Регистру я смог, только заменив текст в массиве с 'redmin' на /redmine/i но это мне кажется неудобным. Есть ли какой способ добавить опцию /i на лету? Или отключить чувствительность к регистру только для этой замены (не глобально)?
|