找到并替换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 ...>
标签,所以我认为它涉及到第二个问题…
请帮我解决以上问题。非常感谢!
首先,您需要将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,则这些字符将被<
或>
替换,因此无法识别表情符号。另一方面,如果在用<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。