找到并替换emoticon与相应的笑脸图像

本文关键字:笑脸 图像 替换 emoticon | 更新日期: 2023-09-27 18:04:31

我锻炼有问题。输入数据是一组句子- string[] sentences -练习的要求是如何在每个句子中找到并替换emoticon(例如::D),并将其导出到。html文件中。

文件文本数据定义emoticon和smiley的结构如下:

[imagename] tab [emoticon1] space [emoticon2] space [emoticon2]

smile.gif    :) :-) :=) (smile)
sadsmile.gif :( :-( :=( (sad)
laugh.gif    :D :-D (laugh)
...

第一个问题是用哪种c#数据结构来存储emoticon和smiley。

I'm happy :). How are you? -> I'm happy <img src="smile"> How are you?

第二个问题是我如何编码搜索和替换emoticon。

最后一个问题是,因为导出的文件是html格式,所以我们必须对html进行编码,可能我们使用的是HttpUtility.HtmlEncode(...),但是resultSentence包含<img ...>标签,所以我认为它涉及到第二个问题…

请帮我解决以上问题。非常感谢!

找到并替换emoticon与相应的笑脸图像

首先,您需要将smiley "mappings"加载到字典中:

Dictionary<string, string> LoadSmileys(string fileName)
{
    var smileys = new Dictionary<string, string>();
    using (var reader = new StreamReader(fileName))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            string[] parts = line.Split(new[] { ''t' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 1; i < parts.Length; i++)
            {
                smileys[parts[i]] = parts[0];
            }
        }
    }
    return smileys;
}

然后,循环遍历键,并将每次出现的键替换为相应的图像。为了避免你对Carra回答的评论中提到的问题,只需先替换最长的键:

StringBuilder tmp = new StringBuilder(originalText);
foreach (var key in smileys.Keys.OrderByDescending(s => s.Length))
{
    tmp.Replace(key, GetImageLink(smileys[key]));
}

注意StringBuilder的使用,以避免创建许多String的实例。

这显然不是最有效的方法,但至少它很简单…如果它最终成为性能瓶颈,您可以稍后尝试优化它。


更新

好的,所以仍然有一个问题,如果你的一些笑脸包含保留的HTML字符,如'<'或'>'…如果在替换表情符号之前将文本编码为HTML,则这些字符将被&lt;&gt;替换,因此无法识别表情符号。另一方面,如果在用<img>标签替换笑脸符号后对文本进行编码,则标签也将被编码。

你可以这样做:

  • 为每个笑脸分配一个唯一的标识符,不太可能出现在原始文本中,如GUID
  • 用相应的标识符替换每个笑脸符号的每次出现(同样,从最长的笑脸符号开始)
  • 将结果文本编码为HTML
  • 用相应的<img>标签替换每个笑脸符号标识符

    var mapping = LoadSmileys(@"D:'tmp'smileys.txt");
    var smileys = mapping.Keys.OrderByDescending(s => s.Length)
                         .ToArray();
    // Assign an ID like "{93e8b75a-6837-43f8-95ec-801ed59bc167}" to each smiley
    var ids = smileys.Select(key => Guid.NewGuid().ToString("B"))
                     .ToArray();
    string text = File.ReadAllText(@"D:'tmp'test_smileys.txt");
    // Replace each smiley with its id
    StringBuilder tmp = new StringBuilder(text);
    for (int i = 0; i < smileys.Length; i++)
    {
        tmp.Replace(smileys[i], ids[i]);
    }
    // Encode the text to HTML
    text = HttpUtility.HtmlEncode(tmp.ToString());
    // Replace each id with the appropriate <img> tag
    tmp = new StringBuilder(text);
    for (int i = 0; i < smileys.Length; i++)
    {
        string image = mapping[smileys[i]];
        tmp.Replace(ids[i], GetImageLink(image));
    }
    text = tmp.ToString();
    

您可以使用简单的字符串。取代。

foreach(string text in sentences)
{
    foreach(var kvp in dict)
    {
      text = text.replace(kvp.Key, GetImageLink(kvp.Value));
    }
}

要创建html,最好使用原生c#类,如htmltextwwriter或XmlWriter。