RegEx для удаления тегов BBCode из строки - PullRequest
1 голос
/ 04 декабря 2010

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

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

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

В настоящее время я использую простой RegEx, чтобы сделать это в C #. По сути, он встраивает в строку встроенные BBCodes, но оставляет много «шумного контента», такого как 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 () для достижения этой цели?

EDITED

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

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

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

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

1 Ответ

2 голосов
/ 04 декабря 2010

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

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

Edit:

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

...