【问题标题】:How to use C# regular expressions to emulate forum tags如何使用 C# 正则表达式模拟论坛标签
【发布时间】:2011-02-05 19:53:15
【问题描述】:

我正在建立一个论坛,我希望能够使用简单的方括号标签来允许用户格式化文本。我目前正在通过解析字符串并查找标签来完成此操作。这非常乏味,尤其是当我遇到这样的标签时 [url=http://www.something.com]Some text[/url]。必须解析属性和值,并确保它具有正确的开始和结束标记,这有点痛苦,而且看起来很愚蠢。我知道正则表达式有多么强大,但我不擅长它们,它们让我无所适从。

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

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

【问题讨论】:

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


【解决方案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;
        }
    }

更新

现在我只是玩得开心。我对其进行了一些清理,并用 \x22 替换了 ",因此可以根据@Brad Christie 的建议轻松转义整个字符串。如果内容中有“[”或“]”字符,这个正则表达式也不会中断。还有它递归处理标签

【讨论】:

  • @used2could:使用 @ 前缀作为文字字符串会极大地清理正则表达式,仅供参考。
  • 是的,但是模式中有一个 ",然后我还是得把它分解
  • @used2could:两害相权取其轻:重复`\\`或单个""。我个人选择了后者。 ;-)
  • 我的偏好是第一个,除非没有任何双引号,然后我会选择@"..."。
  • @Brad Christie:我不知道当字符串以@ 为前缀时,您可以只使用“”(两个)来转义双引号。我以为你必须像 @"some text / string" + "test \" quote" + @".." 一样将字符串分解,谢谢!
【解决方案2】:

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

我建议您考虑使用 Markdown 之类的东西。

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2022-08-19
    相关资源
    最近更新 更多