Tags do fórum. Qual é a melhor maneira de implementá-los?
Estou criando um fórum e quero usar tags no estilo de fórum para permitir que os usuários formatem suas postagens de forma limitada. Atualmente, estou usando o Regex para fazer isso. Conforme esta pergunta: <, a href = "https://stackoverflow.com/questions/4909283/how-to-use-c-regular-expressions-to-emulate-forum-tags"> Como usar expressões regulares em C # emular tags do fórum
O problema é que o regex não distingue entre tags aninhadas. Aqui está um exemplo de como eu implementei esse método:
public static string MyExtensionMethod(this string text)
{
return TransformTags(text);
}
private static string TransformTags(string input)
{
string regex = @"\[([^=]+)[=\x22']*(\S*?)['\x22]*\](.+?)\[/(\1)\]";
MatchCollection matches = new Regex(regex).Matches(input);
for (int i = 0; i < matches.Count; i++)
{
var tag = matches[i].Groups[1].Value;
var optionalValue = matches[i].Groups[2].Value;
var content = matches[i].Groups[3].Value;
if (Regex.IsMatch(content, regex))
{
content = TransformTags(content);
}
content = HandleTags(content, optionalValue, tag);
input = input.Replace(matches[i].Groups[0].Value, content);
}
return input;
}
private static string HandleTags(string content, string optionalValue, string tag)
{
switch (tag.ToLower())
{
case "quote":
return string.Format("<div class='quote'>{0}</div>", content);
default:
return string.Empty;
}
}
Agora, se eu enviar algo como[quote] This user posted [quote] blah [/quote] [/quote]
ele não detecta corretamente a cotação aninhada. Em vez disso, pega a primeira marca de cotação de abertura e a coloca com a primeira marca de cotação de fechamento.
Vocês recomendam alguma solução? A regex pode ser modificada para pegar tags aninhadas? Talvez eu não deva usar regex para isso? Qualquer ajuda é apreciada.