BBcode регулярное выражение для ** полужирный текст ** - PullRequest
5 голосов
/ 20 ноября 2008

Я ужасен с регулярным выражением, но у меня была попытка и Google (и даже посмотрел в источнике reddit), и я все еще застрял, так что здесь идет:

Моя цель - сопоставить следующие «коды» и заменить их тегами HTML. Это просто регулярное выражение, с которым я застрял.

**bold text**
_italic text_
~hyperlink~

Вот мои попытки смелого:

^\*\*([.^\*]+)\*\*$

Почему это не работает? Я использую синтаксис preg.

Ответы [ 4 ]

4 голосов
/ 20 ноября 2008

использование:

\*\*(.[^*]*)\*\*

Объяснение:

\*\*      // match two *'s
(.        // match any character
[^*]      // that is not a *
*)        // continuation of any character
\*\*      // match two *'s

в классе символов "[]" "^" имеет значение только в том случае, если это первый символ. так что (.*) соответствует чему-либо, (.[^*]*) соответствует любому, пока не будет буквально *

edit : в ответ на комментарии, соответствующие звездочке (например, **bold *text**), вам нужно будет использовать не жадное совпадение:

\*\*(.*?)\*\*

классы символов - более эффективные, не жадные совпадения, но невозможно группировать внутри класса символов ( см."Скобки и обратные ссылки ...")

3 голосов
/ 20 ноября 2008

Прежде всего, избавьтесь от ^ и $. Их использование будет соответствовать только строке, которая начинается с ** и заканчивается **. Во-вторых, используйте жадный квантификатор, чтобы сопоставить как можно меньше текста, вместо создания класса символов для всех символов, кроме звездочек.

Вот что я предлагаю:

\*\*(.+?)\*\*
2 голосов
/ 20 ноября 2008

Вот еще одно регулярное выражение: \*\*((?:[^*]|\*(?!\*))*)\*\*

Пример в Perl:

my %tag2re = (b => <<'RE_BOLD', i => '_([^_]*)_');
  \*\*(      # begin bold
    (?:[^*]  # non-star
    |        # or
    \*(?!\*) # single star
    )*       # zero or more times
  )\*\*      # end bold
RE_BOLD

my $text = <<BBCODE;
before  **bold and _italic_ *text
2nd line** after _just
           italic_ 
****
**tag _soup** as a result_
BBCODE

while (my ($tag, $re) = each %tag2re) {
    $text =~ s~$re~<$tag>$1</$tag>~gsx;
}
print $text;

Он печатает:

before  <b>bold and <i>italic</i> *text
2nd line</b> after <i>just
           italic</i> 
<b></b>
<b>tag <i>soup</b> as a result</i>

Или как HTML:

before  <b>bold and <i>italic</i> *text
2nd line</b> after <i>just
           italic</i> 
<b></b>
<b>tag <i>soup</b> as a result</i>

Stackoverflow интерпретируется следующим образом:

до полужирный и курсив * текст 2-я строка после просто курсив


тег суп в результате

1 голос
/ 20 ноября 2008
\*\*(.*?)\*\*

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

просто замените ** на _ или ~ для остальных

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