2013-09-12 4 views
2

Я пытаюсь создать регулярное выражение, которое заменит значения OrderedDictionary соответствующим кодом «<img src="blah" alt="blah">».заменить текст смайлика <img> тег

Потому что он также вводит текстовую версию смайлов alt="", она соответствует дважды, взрывая все.

Моя текущая попытка ниже.

foreach (string smiley in Smilies.Keys) 
{ 
    Regex re = new Regex("(?<!(=\"))" + Smilies[smiley] + "(?<!(\"))"); 
    Trace.WriteLine(re.Replace(msg, @"«img src=""" + path + @"\images\" + Smilies[smiley] + @".gif"" alt=""" + smiley + @"""/»")); 
} 

Смайлики здесь:

 Smilies = new OrderedDictionary(); 
     Smilies.Add(@"O:)", "angel"); 
     Smilies.Add(@":-x", "cheekkiss"); 
     Smilies.Add(@":\", "chin"); 
     Smilies.Add(@"B)", "cool"); 
     Smilies.Add(@":~", "crutches"); 
     Smilies.Add(@"«3", "love"); 
     Smilies.Add(@"»:(", "mad"); 
     Smilies.Add(@"):«", "mad"); 
     Smilies.Add(@":o", "ohmy"); 
     Smilies.Add(@"@(", "ouch"); 
     Smilies.Add(@":)", "smile"); 
     Smilies.Add(@"^_^", "smug"); 
     Smilies.Add(@"^.^", "smug"); 
     Smilies.Add(@":+", "therethere"); 
     Smilies.Add(@":P", "tongue_out"); 

EDIT:

Это в настоящее время работает, по большей части .. Хотя я думаю, что мой метод изменения смайликов в изображениях недостатки.

O:) => alt="O:)" передает входящее в комплект поставки регулярное выражение, соответствующее соответствию и заменяет как alt="O:)" => alt="Oalt=":)"".

Возможно, я ошибаюсь?

foreach (string smiley in Smilies.Keys) 
{ 
    string s = Smilies[smiley].ToString(); 
    string pattern = @"(?<!(=""))" + Regex.Escape(smiley) + @"(?<!(""))"; 
    string rep = @"«img src=""" + path + @"\images\" + s + @".gif"" alt=""" + smiley + @"""/»"; 
    Regex re = new Regex(pattern); 
    if (re.IsMatch(msg)) 
    { 
     Trace.WriteLine("Got a match!"); 
     string m2 = re.Replace(msg, rep); 
     msg = m2; 
    } 
} 
+1

Я редактировал свой титул. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Почему вы хотите использовать регулярное выражение? –

+0

Поскольку, насколько мне известно, String.Replace не позволит мне устанавливать условные обозначения, такие как: Если совпадение окружено кавычками, пропустите. – MisterNad

ответ

0

должно соответствовать и работать должным образом.

foreach (string smiley in Smilies.Keys) 
{ 
    Regex re = new Regex("(?<=\")" + Smilies[smiley] + "(?=\")"); 
    Trace.WriteLine(re.Replace(msg, @"«img src=""" + path + @"\images\" + Smilies[smiley] + @".gif"" alt=""" + smiley + @"""/»")); 
} 

вам придется бежать все специальные символы в смайлик массиве, где вы делаете это, как этот

":)" => "\:\)" 
+0

Я не знаю, связано ли это с тем, что '+ Smilies [смайлик] +' часть интерпретируется как буквальная часть регулярного выражения (например, ':)' она думает, является фиксацией захвата), но она не заменяет ничего в Струна. Это действительно проблема, устраняя это: 'parsing '(? <=") O:) (? = ")" - Слишком много)' s.' – MisterNad

+0

Я обновил свой ответ. – dirtydexter

+0

Я на самом деле просто использовал 'Regex re = new Regex (" (? <= \ ")" + Regex.Escape (smiley) + "(? = \") ");', Теперь он просто не подходит. 'Trace.WriteLine' сам шаблон регулярного выражения показывает, что он дает правильные результаты, он просто не соответствует/не заменяет что-либо в' msg'. – MisterNad

1

Понял работает обернув два раза до конца. Однажды замените смайлики на основе символов на их текстовые копии. :) = [smile] например. Затем второй раз замените только текстовые изображения на изображения, добавив тег alt=":)" в код <img>.

Хотя я не люблю циклировать все 9 ярдов дважды и делать дважды RegEx на входе, это довольно надежный способ сделать это.

Пересмотренный рабочий код ниже.

 foreach (string smiley in Smilies.Keys) 
     { 
      Regex re = new Regex(Regex.Escape(smiley)); 
      msg = re.Replace(msg, "[" + Smilies[smiley] + "]"); 
     } 

     foreach (string smiley in Smilies.Keys) 
     { 
      Regex re = new Regex(@"\[" + Regex.Escape(Smilies[smiley].ToString()) + @"\]"); 
      msg = re.Replace(msg, @"<img src=""" + Application.StartupPath + @"\images\" + Smilies[smiley] + @".gif"" alt=""" + smiley + @""">"); 
     } 
0
public static string MakeSomeSmilies(string incomingtext) 
    { 
     var smilies = new OrderedDictionary 
     { 
      {@"O:)", "angel"}, 
      {@":-x", "cheekkiss"}, 
      {@":\", "chin"}, 
      {@"B)", "cool"}, 
      {@":~", "crutches"}, 
      {@"«3", "love"}, 
      {@"»:(", "mad"}, 
      {@"):«", "mad"}, 
      {@":o", "ohmy"}, 
      {@"@(", "ouch"}, 
      {@":)", "smile"}, 
      {@"^_^", "smug"}, 
      {@"^.^", "smug"}, 
      {@":+", "therethere"}, 
      {@":P", "tongue_out"} 
     }; 
     foreach (string m2 in from string smiley in smilies.Keys let re = new Regex(@"(?<!(=""))" + Regex.Escape(smiley) + @"(?<!(""))") where re.IsMatch(incomingtext) select re.Replace(incomingtext, @"«img src=""" + "sd" + @"\images\" + smilies[smiley] + @".gif"" alt=""" + smiley + @"""/»")) 
     { 
      incomingtext = m2; 
     } 
     return incomingtext; 
    } 
Смежные вопросы