6

我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。

到目前为止我有这个:

my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, '').downcase.gsub(/[^a-z]/, '_')

但第一个问题: - 字符。我想这种方法存在更多问题。

我不控制名称,名称字符串可以有重音、空格和特殊字符。我想删除所有这些,用相应的字母('é' => 'e')替换重音,然后用'_'字符替换其余部分。

名字是这样的:

  • “Prélèvements - 常规”
  • 《健康证》
  • ...

我希望它们像一个没有空格/特殊字符的文件名:

  • “prelevements_routine”
  • “carnet_de_sante”
  • ...

谢谢您的帮助 :)

4

2 回答 2

11

看一下ActiveSupport::Inflector.transliterate,处理这种字符问题非常有用。在那里阅读:ActiveSupport::Inflector

然后,您可以执行以下操作:

ActiveSupport::Inflector.transliterate my_string.downcase.gsub(/\s/,"_")
于 2012-11-21T23:47:39.243 回答
1

使用ActiveStorage::Filename#sanitized,如果空格没问题。

如果空格没问题,我建议保留,如果这是用户提供和/或用户可下载的文件,那么您可以使用ActiveStorage::Filename#sanitized适合这种情况的方法。

它删除了文件名中不允许使用的特殊字符,同时保留了用户通常用来很好地组织和描述其文件的所有好字符,例如空格和 & 符号 (&)。

ActiveStorage::Filename.new( "Prélèvements - Routine" ).sanitized 
#=> "Prélèvements - Routine"

ActiveStorage::Filename.new( "Carnet de santé" ).sanitized 
#=> "Carnet de santé"

ActiveStorage::Filename.new( "Foo:Bar / Baz.jpg" ).sanitized 
#=> "Foo-Bar - Baz.jpg"

String#parameterize如果您想删除几乎所有内容,请使用。

如果您真的想删除所有内容,请尝试String#parameterize

"Prélèvements - Routine".parameterize
#=> "prelevements-routine"

"Carnet de santé".parameterize
#=> "carnet-de-sante"

"Foo:Bar / Baz.jpg".parameterize
#=> "foo-bar-baz-jpg"
于 2022-01-10T20:04:12.573 回答