如何使用C#正则表达式来模拟论坛标签

时间:2011-02-05 19:53:16

标签: c# .net asp.net regex string

我正在构建一个论坛,我希望能够使用简单的方括号标记来允许用户格式化文本。我目前正在通过解析字符串并查找标记来完成此任务。这很乏味,特别是当我遇到像这样的标签时[url = http://www.something.com]有些文字[/ url]。必须解析属性和值,并确保它具有正确的打开和关闭标记是一种痛苦,似乎很愚蠢。我知道正则表达式有多强大,但我不擅长它们,它们让我感到沮丧。

你们中有谁愿意帮助我吗?我想一个例子会让我开始。只是一个用于查找[b]粗体文本[/ b]等标签的正则表达式和带有我上面列出的链接等属性的标签会有所帮助。提前谢谢!

编辑:关于正则表达式的外行人术语教程的链接也很有帮助。

2 个答案:

答案 0 :(得分:1)

这应该有效。 “= something.com”是可选的,可以容纳单引号或双引号,还可以确保结束标记与开始标记匹配。

    protected void Page_Load(object sender, EventArgs e)
    {
        string input = @"My link: [url='http://www.something.com'][b]Some text[/b][/url] is awesome. Jazz hands activate!!";
        string result = Parse(input);
    }

//Result: My link: <a href="http://www.something.com"><b>Some text</b></a> is awesome. Jazz hands activate!!


    private static string Parse(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 = Parse(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 "url":
                return string.Format("<a href=\"{0}\">{1}</a>", optionalValue, content);
            case "b":
                return string.Format("<b>{0}</b>", content);
            default:
                return string.Empty;
        }
    }

更新

现在我只是玩得开心。我清理了一下并更换了“with \ x22,因此根据@Brad Christie的建议,整个字符串很容易被转义。如果内容中有”[“或”]“字符,这个正则表达式也不会破坏。它以递归方式处理标签

答案 1 :(得分:1)

我并不是说你不能用正则表达式来做这件事,但我认为你会发现非常非常困难。您必须决定如何处理[b]this is [bold text[/b]以及用户有[]个字符的其他情况。你会允许嵌套吗? (即[b]this is bold, [i]italic[/i] text[/b])。

我建议您考虑使用类似Markdown的内容。