在 Elm 中格式化字符串

Format a string in Elm

我有一个字符串列表,并使用 li 标签将其动态生成到 HTML。我也想将该值分配给 id 属性。但问题是字符串项有一些特殊字符,如 :'é、...我只希望输出包含数字 (0-9) 和字母仅限 (a-z)。

// Input:
listStr = ["Pop & Suki", "PINK N' PROPER", "L'Oréal Paris"]

// Output: 
result = ["pop_suki", "pink_n_proper", "loreal_paris"] ("loral_paris" is also good)

目前,我只是将" "小写并替换为_,但不知道如何消除特殊字符。

非常感谢!

不要将其视为 消除特殊字符, 考虑允许的字符 – 您只需要小写字母数字字符。

Elm 提供 Char.isAlphaNum to test for alphanumeric characters, and Char.toLower to transform a character to lower case. It also provides the higher function String.foldl,您可以使用它一次处理 StringChar

因此对于每个字符:

  • 检查它是否为字母数字
  • 如果是,将其转换为小写
  • 如果不是并且是space,将其转换为下划线
  • 否则删除角色

综上所述,我们创建了一个函数来处理一个字符并将其附加到到目前为止已处理的字符串,然后将其应用于输入字符串中的所有字符:

transformNextCharacter : Char -> String -> String
transformNextCharacter nextCharacter partialString =
    if Char.isAlphaNum nextCharacter then
        partialString ++ String.fromChar (Char.toLower nextCharacter)
    else if nextCharacter == ' ' then
        partialString ++ "_"
    else
        partialString

transformString : String -> String
transformString inputString =
    String.foldl transformNextCharacter "" inputString

在线演示here.

注意:这个答案只是删除特殊字符,从而产生 "loral_paris",根据 OP 是可以接受的。

打勾的答案比我下面的代码效率高很多。尽管如此,我只是想将我的代码添加为可选方法。

尽管如此,如果您想将重音符号更改为普通字符,您可以安装并使用 elm-community/string-extra 软件包。那个有去除重音的方法。

下面的代码效率低下,因为您一直在同一个字符串上调用库函数,而所有这些函数都会一次一个字符地遍历您的字符串。

另外,请注意,当您删除第一个索引中的 & 时,您将有一个双下划线。您必须将双下划线替换为单下划线。

import Html exposing (text)
import String
import List
import String.Extra
import Char

listStr = ["Pop & Suki", "PINK N' PROPER", "L'Oréal Paris"]

-- True if alpha or digit or space, otherwise, False.
isDigitAlphaSpace : Char -> Bool
isDigitAlphaSpace c =
  if Char.isAlpha c || Char.isDigit c || c == ' ' then
    True
  else 
    False

main =
  List.map (\x -> String.Extra.removeAccents x     --Remove Accents first
               |> String.filter isDigitAlphaSpace  --Remove anything that not digit alpha or space
               |> String.replace " " "_"           --Replace space with _  
               |> String.replace "__" "_"          --Replace double __ with _
               |> String.toLower) listStr          --Turn the string to lower
    |> Debug.toString
    |> Html.text