require 'iconv'

def build_nice_url(str)
    str = Iconv.new('us-ascii//TRANSLIT', 'utf-8').iconv(str).strip.downcase
    str = str.gsub(/[^a-z0-9\-\.,\*]/, '-').gsub(/([\-\.,\*]){2,}/, '\1').gsub(/^[^a-z0-9]|[^a-z0-9]$/, '')
end

petite explication pour les néophytes :

  • la chaîne passée en argument est convertie en chaîne ASCII valide grâce à ICONV
  • les espaces sont enlevés
  • la chaîne est passée en minuscules
  • tous les caractères qui ne sont pas
    • des lettres de l'alphabet
    • des chiffres
    • -
    • .
    • ,
    • *
    sont transformés en "-"
  • les caractères
    • -
    • .
    • ,
    • *
    qui se répétent sont réduits à un seul, par exemple "salut-,comment ça va" devient "salut,comment-ca-va"
  • et finalement on enlève les caractères non-pertinents qui pourraient se trouver en début et fin de chaîne

Un petit exemple d'utilisation maintenant :

build_nice_url("$*mon texte avec des virgules, points., accent éàû et répétition----hop !--")
=> "mon-texte-avec-des-virgules-points-accent-eau-et-repetition-hop"

Il ne vous reste plus qu'à intégrer ça dans vos applications Ruby(OnRails) ;-)

Vous noterez toutefois que ce code ne fonctionne correctement avec les caractères accentués qu'avec un interpréteur Ruby >= 1.8.4.