我对正则表达式很糟糕,但我已经尝试过了并谷歌了一下(甚至查看了Reddit的源代码),但我仍然卡住了,所以就来这里求助:
我的目标是匹配以下“代码”并用HTML标签替换它们。我只是不知道如何编写正则表达式。
**bold text**
_italic text_
~hyperlink~
以下是我尝试加粗的内容:
以下是我尝试加粗的内容:
^\*\*([.^\*]+)\*\*$
为什么这个不起作用?我正在使用preg语法。
我对正则表达式很糟糕,但我已经尝试过了并谷歌了一下(甚至查看了Reddit的源代码),但我仍然卡住了,所以就来这里求助:
我的目标是匹配以下“代码”并用HTML标签替换它们。我只是不知道如何编写正则表达式。
**bold text**
_italic text_
~hyperlink~
以下是我尝试加粗的内容:
^\*\*([.^\*]+)\*\*$
为什么这个不起作用?我正在使用preg语法。
使用:
\*\*(.[^*]*)\*\*
说明:
\*\* // match two *'s
(. // match any character
[^*] // that is not a *
*) // continuation of any character
\*\* // match two *'s
(.*)
匹配任何内容,(.[^*]*)
匹配任何内容直到遇到字面上的"*"。
编辑: 根据评论反应,如果要匹配括号内的星号(如**粗体 *文本**
),必须使用非贪婪匹配:\*\*(.*?)\*\*
***test**
。 - Brad Gilbert首先,去掉^和$。使用它们只会匹配以**开头和结尾的字符串。其次,使用贪婪量词尽可能少地匹配文本,而不是为除星号外的所有字符创建字符类。
这是我建议的方法:
\*\*(.+?)\*\*
\*\*((?:[^*]|\*(?!\*))*)\*\*
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 加粗和斜体*文本 第二行后面是只有斜体
标签汤结果为
\*\*(.*?)\*\*
这将适用于粗体文本。
只需将其他部分的**替换为_或~即可。