Во-первых, вам нужно загрузить смайликовые «отображения» в словарь:
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;
}
Затем просто зациклите клавиши и замените каждое вхождение ключа соответствующим изображением.Чтобы избежать проблемы, упомянутой в вашем комментарии к ответу Карры, просто замените сначала самые длинные ключи:
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();