RegEx для удаления тегов BBCode из строки

Я работаю над функцией, которая использует JQuery MarkItUp! редактор как редактор BBCode. Я разрешаю только небольшое подмножество BBCode, включая следующее:

[b]
[i]
[quote]
[quote=Mr Incredible]
[img]
[url]
[youtube]

У меня есть 1500-символьное поле «Описание», в котором используется редактор, но я также планирую сохранить 150-символьный дайджест описания, убрав весь BBCode.

В настоящее время я использую простой RegEx для этого на С#. По сути, он удаляет встроенные BBCode в строку, но оставляет после себя много «шумного контента», такого как URL-адрес [img] или идентификатор видео [youtube], которые я также хотел бы удалить из дайджеста.

Вот мой текущий RegEx:

  public static String StripBBCode(string bbCode)
  {
     string r = Regex.Replace(bbCode,
     @"\[(.*?)\]",
     String.Empty, RegexOptions.IgnoreCase);

     // Finally, replace all newlines with a space
     r = Regex.Replace(r,
     @"(\r\n|\n\r|\r|\n)+",
     @" ", RegexOptions.IgnoreCase);

     return r;
  }

Если я запускаю следующую строку через эту функцию, я получаю результат, показанный ниже:

источник

This is [b]bold[/b]. This is [i]italic[/i].

Here is an image:
[img]http://www.phatmac.com/Pics/Movies/Incredibles.jpg[/img]

Here is a link to [url=http://espn.go.com]ESPN[/url].

Here is a YouTube video:

[youtube]WJ0UkZ3W4FA[/youtube]

результат

Это смело. Это курсив. Вот изображение: http://www.phatmac.com/Pics/Movies/Incredibles.jpg Вот ссылка на ESPN. Вот видео на YouTube: WJ0UkZ3W4FA

Вот что я хочу вернуть

Это смело. Это курсив. Вот изображение: Вот ссылка на ESPN. Вот видео на YouTube:

Как я могу изменить свою функцию StripBBCode() для достижения этой цели?

ОТРЕДАКТИРОВАНО

Предложение Дэвида ниже в первом ответе было правильным.

Вот что я использую сейчас:

 string r = Regex.Replace(s,
    @"\[youtube\].*\[\/youtube\]",
    String.Empty, RegexOptions.IgnoreCase);

 r = Regex.Replace(r,
    @"\[img\].*\[\/img\]",
    String.Empty, RegexOptions.IgnoreCase);

person Armchair Bronco    schedule 04.12.2010    source источник


Ответы (1)


У вас есть несколько тегов, которые вы хотите удалить из контента, а остальные, где вы хотите удалить только теги.

Замените [img].*[/img] на string.empty, [youtube].*[/youtube] и все, что вам нужно, чтобы удалить содержимое, затем удалите [.*].

Редактировать:

Я тоже не эксперт по регулярным выражениям, но я думаю, что @"\[img\].*?\[/img\]" - это то, что вам нужно. Я не думаю, что вам нужны круглые скобки в @"\[(.*?)\]", я думаю, что в этом контексте круглые скобки означают сохранение совпадающего текста, чтобы вы могли снова сопоставить его с \1.

person David Yaw    schedule 04.12.2010
comment
Как выглядит регулярное выражение для удаления [img].*[/img]? Я не специалист по RegEx, и исходные регулярные выражения в моей функции были результатом многих сеансов вырезания и вставки, чтобы получить правильный синтаксис. - person Armchair Bronco; 04.12.2010
comment
Спасибо. У меня есть версия, добавленная в конец исходного вопроса, которая, кажется, работает. У меня нет встроенного вопросительного знака, как у вас. В любом случае, спасибо, что указали мне правильное направление. Я ценю это! - person Armchair Bronco; 04.12.2010
comment
Знак вопроса на .*? делает это выражение ленивым, потребляя минимальное количество символов, необходимое для выполнения выражения. Без него регулярное выражение сократит [img]asdf[/img] Important Text [img]asdf[/img] до пустой строки. - person David Yaw; 04.12.2010