用于**粗体文字的BBcode正则表达式**

时间:2008-11-19 22:30:49

标签: regex

我对正则表达式很糟糕,但是我尝试了一下谷歌(甚至看过reddit的来源)我仍然卡住了,所以这里:

我的目标是匹配以下“代码”并将其替换为HTML代码。这只是我坚持使用的正则表达式。

**bold text**
_italic text_
~hyperlink~

这是我对大胆的尝试:

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

为什么这不起作用?我正在使用preg语法。

4 个答案:

答案 0 :(得分:4)

使用:

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

说明:

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

在一个字符类“[]”中,“^”只有在它是第一个字符时才有意义。所以(.*)匹配任何内容,(.[^*]*)匹配任何内容直到文字*

编辑:为了回复与星号匹配的评论(即**bold *text**),您必须使用非贪婪的匹配:

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

字符类是更有效的非贪婪匹配,但不可能在字符类(see“括号和反向引用...”中进行分组。)

答案 1 :(得分:3)

首先,摆脱^和$。使用它们只匹配以**开头并以**结尾的字符串。其次,使用贪婪量词来匹配尽可能少的文本,而不是为星号以外的所有字符创建一个字符类。

这是我的建议:

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

答案 2 :(得分:2)

这是另一个正则表达式:\*\*((?:[^*]|\*(?!\*))*)\*\*

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  bold and italic *text
2nd line after just
           italic 

tag soup as a result

Stackoverflow的解释是:

粗体和斜体 *文字之前

之后的第二行            斜体


结果

标记

答案 3 :(得分:1)

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

适用于粗体文字

只需将**替换为_或〜替换其他