умная замена персонажа с использованием ruby ​​gsub и regexp - PullRequest
4 голосов
/ 20 апреля 2010

Я пытаюсь создать поведение с постоянными ссылками для некоторых названий статей и не хочу добавлять новое поле БД для постоянной ссылки. Поэтому я решил написать помощника, который преобразует название моей статьи из:

" O "focoasă" а pornit cruciada, împotriva bărbaţilor zgârciţi " в " о-focoasa-а-pornit-cruciada-impotriva-barbatilor-zgarciti ".

Пока я выяснил, как заменить пробелы дефисами и удалить другие специальные символы (кроме -), используя:

title.gsub(/\s/, "-").gsub(/[^\w-]/, '').downcase

Мне интересно, есть ли какой-либо другой способ заменить символ конкретным другим символом только из одного вызова метода .gsub, поэтому мне не придется связывать методы title.gsub ("ă", "a") для всех специальных символов UTF-8 моей локализации.

Я думал о создании хэша со всеми специальными символами и их аналогами, но я еще не понял, как использовать переменные с регулярными выражениями.

Я искал что-то вроде:

title.gsub(/\s/, "-").gsub(*replace character goes here*).gsub(/[^\w-]/, '').downcase

Спасибо!

Ответы [ 2 ]

5 голосов
/ 20 апреля 2010

Я решил это в своем приложении, используя Unidecoder gem:

require 'unidecode'

def uninternationalize(str)
  Unidecoder.decode(str).gsub("[?]", "").gsub(/`/, "'").strip
end
4 голосов
/ 21 апреля 2010

Если вы хотите транслитерировать только от одного символа к другому, вы можете использовать метод String#tr, который делает то же самое, что и команда Unix tr: заменить каждый символ в первом списке на символ в том же самом позиция во втором списке:

'Ünicöde'.tr('ÄäÖöÜüß', 'AaOoUus') # => "Unicode"

Однако я согласен с @Daniel Vandersluis: возможно, было бы неплохо использовать более специализированную библиотеку. Такие вещи могут стать очень утомительными, очень быстрыми. Кроме того, многие из этих символов на самом деле имеют стандартизированные транслитерации (ä & rarr; ae, ö & rarr; oe, ..., ß & rarr; ss), и пользователи могут ожидать, что транслитерации будут правильными (мне определенно не нравится меня зовут Йорг - если вам действительно нужно, вы можете звать меня Йорг, но я очень предпочитаю Йорг), и если у вас есть библиотека, которая предоставляет вам эти транслитерации, почему бы не использовать их? Обратите внимание, что существует много транслитераций, которые не являются одиночными символами и поэтому не могут использоваться с String#tr в любом случае.

...