BBcode正则表达式用于**加粗文本**。

5

我对正则表达式很糟糕,但我已经尝试过了并谷歌了一下(甚至查看了Reddit的源代码),但我仍然卡住了,所以就来这里求助:

我的目标是匹配以下“代码”并用HTML标签替换它们。我只是不知道如何编写正则表达式。

**bold text**
_italic text_
~hyperlink~

以下是我尝试加粗的内容:

以下是我尝试加粗的内容:

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

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


这不是BBCode! - SaidbakR
4个回答

4

使用:

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

说明:

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

在字符类"[ ]"中,"^"只有在作为第一个字符时才具有特殊意义。因此(.*)匹配任何内容,(.[^*]*)匹配任何内容直到遇到字面上的"*"。 编辑: 根据评论反应,如果要匹配括号内的星号(如**粗体 *文本**),必须使用非贪婪匹配:
\*\*(.*?)\*\*

字符类是更高效的非贪婪匹配方式,但在字符类中不能进行分组操作(详见"括号和反向引用..."参考网页)。

这并不意味着一个星号就能匹配像这样的字符串:'What is 3 * 4?'。 - Paige Ruten
我认为你想在这里去掉句号。它对 ** 有效,但是 (.[^]*)_ 将把 __ hi 转换成 <i></i>hi_,而不是 <i></i> <i>hi</i>。 - Mark
你的第一个答案不应该有一个点,它将匹配***test** - Brad Gilbert

3

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

这是我建议的方法:

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

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>加粗和<i>斜体</i> *文本
第二行</b>后面是<i>只有斜体</i> 
<b></b>
<b>标签<i>汤</b>结果为</i>

或者作为html:

before  加粗和斜体*文本
第二行后面是只有斜体

标签结果为

Stackoverflow的解释是:

before 加粗和斜体*文本 第二行后面是只有斜体


标签结果为


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

这将适用于粗体文本

只需将其他部分的**替换为_或~即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接