Найдите и замените смайлик соответствующим изображением смайлика - PullRequest
1 голос
/ 05 августа 2011

У меня проблема с упражнениями. Входные данные представляют собой набор предложений - string[] sentences - Требование упражнения заключается в том, чтобы найти и заменить смайлик (например:: D) в соответствии с изображением смайлика в каждом предложении, а затем экспортировать их в файл .html.

Текстовые данные файла определяют смайлик, а смайлик имеет такую ​​структуру:

[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? -> I'm happy <img src="smile"> How are you?

Вторая проблема - это способ кодирования для поиска и замены смайликов.

последняя проблема - , поскольку файл экспорта имеет формат html, поэтому мы должны кодировать html, может быть, мы используем HttpUtility.HtmlEncode(...) Но resultSentence содержит тег <img ...>, так что я думаю, что он используется для второй выпуск ...

Пожалуйста, помогите мне решить вышеуказанную проблему. Большое спасибо!

Ответы [ 2 ]

1 голос
/ 06 августа 2011

Во-первых, вам нужно загрузить смайликовые «отображения» в словарь:

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 перед заменой смайликов, эти символы будут заменены на &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();
    
0 голосов
/ 05 августа 2011

Вы можете использовать простой string.replace здесь.

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

Для создания html лучше использовать собственные классы C #, такие как HtmlTextWriter или XmlWriter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...