Takie moje rozwiązanie (napisane teraz przez jakieś 30 minut pewnie).
Ogólnie to napisałem prosty parser i podmieniacz do bb-codes. 'jądro' konwertera wygląda tak:
Kopiuj
public BbCodeConverter()
{
this.CreateRules(
BbCodeRule.Bold,
BbCodeRule.Image,
BbCodeRule.Italic,
BbCodeRule.Underline);
}
Gdzie BbCodeRule to zdefiniowane zasady podmieniania. Na przykład taka:
Kopiuj
public static readonly BbCodeRule Image = new BbCodeRule("img", "<img src={0} alt=\":(\" />");
ogólnie {0} to tekst znajdujący się pomiędzy znakami bb-code czyli np. [b]ten tekst[/b]. Można by to bardzo łatwo rozszerzyć np. o składnie [quote=username]...[/quote] tak żeby tekst po = był dopasowywany do {1} ale tego nie zrobiłem.
Samo podmienianie jest trochę magicznie ale się nie starałem hamować ;)
Kopiuj
public string Convert(string input)
{
string pattern = @"\[(?<bbId>\w+)\](?<text>.*)\[/\k<bbId>\]";
Regex regex = new Regex(pattern, RegexOptions.Multiline);
bool anyReplaced = true;
while (anyReplaced)
{
anyReplaced = false;
input = regex.Replace(input, (match) =>
{
anyReplaced = true;
string foundId = match.Groups["bbId"].Value;
if (rules.ContainsKey(foundId))
{
return rules[foundId].Format(match.Groups["text"].Value);
}
return "";
});
}
return input;
}
Pętla while byłaby niepotrzebna gdyby nie zagnieżdżone bb-cody - w takim wypadku jedno przejście nie wystarczy bo wewnętrzne zostaną pominięte.
Jeśli nie rozumiesz regexów to nic dziwnego bo wyglądają kosmicznie, ale się naucz bo to naprawdę przydatna rzecz.
I to w sumie wszystko... Został jeszcze tylko banalny kod obsługi buttona:
Kopiuj
private void button1_Click(object sender, EventArgs e)
{
string input = textBox1.Text;
string output = converter.Convert(input);
webBrowser1.DocumentText = output;
textBox2.Text = output;
}
Mam nadzieję że pomogłem, pozdrawiam.
projekt: MinimalBbCode.zip
skrinszot: 
jeśli znajdziesz jakieś bugi których nie będziesz w stanie poprawić to pisz, nie testowałem dokładnie więc mogą się kryć wszędzie (to zresztą chyba pierwszy raz kiedy regex pisany z palca zadziałał od razu a to podejrzane)