在 Perl 中使用正则表达式将降价斜体替换为 html

Substitute the markdown italic to html using regex in Perl

要将降价斜体文本$script转换为html,我这样写:

my $script = "*so what*";
my $res =~ s/\*(.)\*//g;
print "<em></em>\n";

预期结果是:

<em>so what</em>

但它给出:

<em></em>

如何让它达到预期的效果?

问题:

  • 你打印了错误的变量。
  • 你在中途切换了变量名。
  • . 不会匹配超过一个字符。
  • 你总是添加一个 EM 元素,即使没有找到星星。
  • 你总是添加一个 EM 元素,即使找到多对恒星也是如此。
  • 您在整个输出周围添加 EM 元素,而不仅仅是星星中的部分。

修复:

$script =~ s{\*([^*]+)\*}{<em></em>}g;
print "$script\n";

my $res = $script =~ s{\*([^*]+)\*}{<em></em>}gr;
print "$res\n";

但事实并非如此。即使解决了上述所有问题,您的解析器仍然存在许多其他错误。例如,它错误地将斜体应用于以下所有内容:

  • **Important**
    正确:重要
    您的代码:*重要*
  • 4 * 5 * 6 = 120
    正确:4 * 5 * 6 = 120
    您的代码:4 5 6 = 120
  • 4 * 6 = 20 is *wrong*
    正确:4 * 6 = 20 错误
    您的代码:4 6 = 20 错误*
  • `foo *bar* baz`
    正确:foo *bar* baz
    您的代码:`foo bar baz`
  • \*I like stars\*
    正确:*我喜欢星星*
    您的代码:\我喜欢星星\