2015-06-15 2 views
1

Я посмотрел повсюду для регулярного выражения, которое будет работать для этого на C#, но ничего не может получить. Я нашел много для PHP, но не уверен, как преобразовать его в C#. Так что я пытаюсь сделать это просто создать регулярное выражение, которое рекурсивно соответствует bbcode для цитаты, а затем изменяет его на HTML. Вот пример:Регулярное выражение для вложенных цитат из bbcode

[quote="bob"]I can't believe that you said this: [quote="joe"]I love lamp. 
[/quote] That's hilarious![/quote] 

Это должно превратиться в:

<fieldset class="bbquote"><legend>bob</legend>I can't believe that you said 
this: <fieldset class="bbquote"><legend>joe</legend>I love lamp.</fieldset> 
That's hilarious!</fieldset> 

Все регулярных выражений выражений, которые я попробовал бы с треском провалились.

+1

«Я нашел много для PHP, но не уверены в том, как преобразовать его на C#» - это регулярное выражение в значительной степени регулярное выражение (с небольшими вариациями) –

+0

Я редактировал свой титул. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Использование PHP в коде C# не сработало. И я не был в том числе тегом, но пытался подчеркнуть, что он находится на C#, так что это не будет путать. Извините за недоразумение .. –

ответ

0

Это не нужно делать это рекурсивно или в соответствии с соответствующим начало и конец цитаты - наконец-то, как раз такое же количество пусков и концы должны быть заменены. Это может быть выполнено для любого вложения с e. г .:

void Main() 
{ 
    String s = "[quote=\"bob\"]I can't believe that you said this: [quote=\"joe\"]I love lamp.[/quote] That's hilarious![/quote]"; 
    Regex r = new Regex(@"\[quote=""(\w+)""\](.*?)\[/quote]"); 
    while (r.Match(s).Success) 
     s = r.Replace(s, "<fieldset class=\"bbquote\"><legend>$1</legend>$2</fieldset>"); 
    Console.WriteLine(s); 
} 
0

Вы можете попробовать это:

using System; 
using System.Text.RegularExpressions; 

class Program 
{ 
    static void Main() 
    { 
     String sample = "[quote=\"bob\"]I can't believe that you said this: [quote=\"joe\"]I love lamp.[/quote] That's hilarious![/quote]"; 
     Regex regex = new Regex(@"(?:(?:\[quote="")(\w+)(?:""\])?([^\[]+))(?:(?:\[quote="")(\w+)(?:""\])?([^\[]+))(?:[^\]]+\]\s)([^\[]+)(?:\[\/quote\])"); 

     Match match = regex.Match(sample); 

     if (match.Success) 
     { 
      Console.WriteLine(regex.Replace(sample,"<fieldset class=\"bbquote\"><legend>$1</legend>$2<fieldset class=\"bbquote\"><legend>$3</legend>$4</fieldset>$5</fieldset>")); 
     } 
    } 
} 

он захватывает 5 групп:

  • $ 1 боб
  • $ 2 Я не могу поверить, что вы это сказали:
  • $ 3 джо
  • $ 4 Я люблю лампу.
  • $ 5 Это весело!

который можно заменить, чтобы получить:

<fieldset class="bbquote"><legend>bob</legend>I can't believe that you said this: <fieldset class="bbquote"><legend>joe</legend>I love lamp.</fieldset>That's hilarious!</fieldset> 
+0

Хотя похоже, что это работает, я стараюсь не беспокоиться о том, чтобы узнать точное количество рекурсивных вызовов, которые получает цитата. Поэтому, если у человека есть одна цитата (без рекурсивных вызовов), это легко. Но одно и то же регулярное выражение должно быть в состоянии определить, есть ли два или более рекурсивных вызова. Таким образом, обсуждение с тройным цитированием было бы так же легко сделать. Я получил его работу с простыми bbcodes, такими как подчеркивание, жирный текст и т. Д. (Что требует сохранения только одной группы). Но сохранение двух групп и рекурсивное движение вниз - вот где у меня проблемы. Пока кто-то не ответит, я воспользуюсь этим. благодаря –

Смежные вопросы