将Javascript slugifier转换为C#
本文关键字:转换 slugifier Javascript | 更新日期: 2023-09-27 17:58:55
我正在考虑由diegok转换JS slugify函数,他正在使用这个JavaScript构造:
function turkish_map() {
return {
'ş':'s', 'Ş':'S', 'ı':'i', 'İ':'I', 'ç':'c', 'Ç':'C', 'ü':'u', 'Ü':'U',
'ö':'o', 'Ö':'O', 'ğ':'g', 'Ğ':'G'
};
}
这是一个字符到字符翻译的映射。然而,我不知道这是哪个JS构造,如何在C#中重写它,而不需要花费太多时间?(它还有更多功能,这只是其中一个功能)。
我应该做一个数组、字典还是其他什么?
Dictionary<char, char> turkish_map() {
return new Dictionary<char, char> {
{'ş','s'}, {'Ş','S'}, {'ı','i'}, {'İ','I'} {'ç','c'} , {'Ç','C' }, {'ü','u'}, {'Ü','U'}, {'ö','o'}, {'Ö','O'}, {'ğ','g'}, {'Ğ','G'} };
}
像这样使用:
turkish_map()['İ'] // returns I
或者,您可以将它保存到字段中并使用它,而无需每次都创建它。
使用这些方法删除变音符号,结果将是sSıIcCuUoOgG
。
namespace Test
{
public class Program
{
public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm, Func<char, char> customFolding)
{
foreach (char c in src.Normalize(compatNorm ? NormalizationForm.FormKD : NormalizationForm.FormD))
switch (CharUnicodeInfo.GetUnicodeCategory(c))
{
case UnicodeCategory.NonSpacingMark:
case UnicodeCategory.SpacingCombiningMark:
case UnicodeCategory.EnclosingMark:
//do nothing
break;
default:
yield return customFolding(c);
break;
}
}
public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm)
{
return RemoveDiacritics(src, compatNorm, c => c);
}
public static string RemoveDiacritics(string src, bool compatNorm, Func<char, char> customFolding)
{
StringBuilder sb = new StringBuilder();
foreach (char c in RemoveDiacriticsEnum(src, compatNorm, customFolding))
sb.Append(c);
return sb.ToString();
}
public static string RemoveDiacritics(string src, bool compatNorm)
{
return RemoveDiacritics(src, compatNorm, c => c);
}
static void Main(string[] args)
{
var str = "şŞıİçÇüÜöÖğĞ";
Console.Write(RemoveDiacritics(str, false));
// output: sSıIcCuUoOgG
Console.ReadKey();
}
}
}
对于其他未转换的字符,如ı
,以及您提到的@
、™
,您可以使用该方法删除变音符号,然后使用正则表达式删除无效字符。如果你足够关心某些字符,你可以制作一个Dictionary<char, char>
,并用它来替换每个字符。
然后你可以这样做:
var input = "Şöme-p@ttern"; // text to convert into a slug
var replaces = new Dictionary<char, char> { { '@', 'a' } }; // list of chars you care
var pattern = @"[^A-Z0-9_-]+"; // regex to remove invalid characters
var result = new StringBuilder(RemoveDiacritics(input, false)); // convert Ş to S
// and so on
foreach (var item in replaces)
{
result = result.Replace(item.Key, item.Value); // replace @ with a and so on
}
// remove invalid characters which weren't converted
var slug = Regex.Replace(result.ToString(), pattern, String.Empty,
RegexOptions.IgnoreCase);
// output: Some-pattern