使用相应的笑脸图像查找并替换表情符号

时间:2011-08-05 10:22:48

标签: c# regex string data-structures replace

我的运动有问题。输入数据是一组句子 - string[] sentences - 练习的要求是如何在每个句子中根据笑脸图像查找和替换表情符号(例如:D),然后将它们导出到.html文件。 / p>

文件文本数据定义表情符号,笑脸的结构类似:

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

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

第一个问题是C#的数据结构,用于存储表情符号和笑脸。

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

第二个问题是我编码搜索和替换表情符号的方式。

最后一期是,因为导出文件是html格式,所以我们必须编码html,可能我们使用HttpUtility.HtmlEncode(...)但是resultSentence包含<img ...>标记,所以我认为它侵入了第二个问题......

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

2 个答案:

答案 0 :(得分:1)

首先,您需要将笑脸“映射”加载到字典中:

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的多个实例。

这显然不是最有效的方法,但至少它很简单......如果结果是性能瓶颈,你总是可以尝试优化它。


更新

好的,如果你的一些表情符号包含像'&lt;'这样的保留HTML字符,那么仍有问题或'&gt;'...如果您在替换表情符号之前将文本编码为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();
    

答案 1 :(得分:0)

你可以在这里使用简单的string.replace。

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

要创建html,您最好使用本地C#类,如HtmlTextWriter或XmlWriter。