Как использовать регулярные выражения C # для эмуляции тегов форума - PullRequest
1 голос
/ 05 февраля 2011

Я создаю форум и хочу использовать простые квадратные скобки, чтобы пользователи могли форматировать текст.В настоящее время я выполняю это путем анализа строки и поиска тегов.Это очень утомительно, особенно когда я сталкиваюсь с таким тегом, как этот [url = http://www.something.com]Some text [/ url].Необходимость разбора атрибута и значения и проверки правильности открывающих и закрывающих тегов - это боль и кажется глупой.Я знаю, насколько сильны регулярные выражения, но я не силен в них, и они меня бесят.Я думаю, что пример поможет мне начать.Было бы полезно найти регулярное выражение для поиска тегов, таких как [b] жирный текст [/ b], и тегов с атрибутами, такими как ссылка, которую я перечислил выше.Заранее благодарим!

Редактировать: Ссылки на учебные материалы для регулярных выражений также полезны.

Ответы [ 2 ]

1 голос
/ 05 февраля 2011

Я не говорю, что вы не можете сделать это с помощью регулярных выражений, но я думаю, вы найдете это очень, очень сложно. Вам нужно решить, что делать с такими вещами, как [b]this is [bold text[/b] и другими случаями, когда у пользователя есть символы [ или ]. А ты позволишь вложение? (т.е. [b]this is bold, [i]italic[/i] text[/b]).

Я бы посоветовал вам использовать что-то вроде Markdown .

1 голос
/ 05 февраля 2011

Это должно работать. «= Нечто.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;
        }
    }

UPDATE

Теперь я просто веселюсь с этим. Я немного почистил его и заменил "на \ x22, чтобы всю строку можно было легко экранировать по предложению @Brad Christie. Также это регулярное выражение не будет разрываться, если в содержимом есть символы" ["или"] ". Также рекурсивно обрабатывает теги

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...