我的运动有问题。输入数据是一组句子 - 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 ...>
标记,所以我认为它侵入了第二个问题......
请帮我解决上述问题。非常感谢!
答案 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,则这些字符将替换为<
或>
,因此不会识别表情符号。另一方面,如果您在用<img>
标签替换表情符号后对文本进行编码,则标签也会被编码。
以下是您可以做的事情:
使用相应的<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。