2

我想将我的博客从 Markdown 转换为 html。而且,我曾经[crayon lang="cpp"]...[/crayon]粘贴代码。我想得到由 包裹的每一行,[crayon][/crayon]然后在每行的开头添加 4 个空格。例如:

Some text

[crayon lang="bash"]
#!/bin/bash
[/crayon]

other text

[crayon lang="cpp"]
int main()
{
}
[/crayon]

我希望它是:

Some text

    #!/bin/bash

other text

    int main()
    {
    }

我不知道该怎么做regex。有人可以帮我吗?

这是我尝试过的:

  • \[crayon.*?\]([\d\D]*?)\[\/crayon\] \1匹配由 包裹的所有行[crayon][/crayon],但我不能添加空格。
  • (?'st'\[crayon.*?\])^.*$(?'-st'\[/crayon\])不匹配
4

3 回答 3

1

一个(相对)简单的方法是分两步完成:

1

每行的开头插入 4 个空格,但只有前后 '[crayon lang="..."]'的行 '[/crayon]'

pattern     : (?ms)^(?=(?:(?!\[crayon\b).)*\[/crayon])
replacement : '    ' (4 spaces)

2

删除所有'[crayon lang="..."]''[/crayon]'

pattern     : \[/?crayon.*?][ \t]*(\r?\n|$)
replacement : '' (empty string)

一个 PHP 演示:

<?php

$text = 'Some text

[crayon lang="bash"]
#!/bin/bash
[/crayon]

other text

[crayon lang="cpp"]
int main()
{
}
[/crayon]';

$text = preg_replace('#^(?=(?:(?!\[crayon\b).)*\[/crayon])#ms', '    ', $text);

$text = preg_replace('#\[/?crayon.*?][ \t]*(\r?\n|$)#', '', $text);

echo "$text\n";

?>

这将打印:

一些文字

    #!/bin/bash

其他文字

    主函数()
    {
    }

快速解释,也许是简洁的正则表达式^(?=(?:(?!\[crayon\b).)*\[/crayon])

^                    # match the start of a line
(?=                  # start positive look ahead
  (?:                #   start group
    (?!\[crayon\b).  #     match any char as long as it doesn't have `[crayon` in front of it
  )*                 #   end group and repeatr it zero or more times
  \[/crayon]         #   match '[/crayon]'
)                    # end positive look ahead

用简单的英语写成:

匹配行的任何开头,[/crayon]此行开始之前有 a ,并且 在此行开始之间[/crayon]不能有[crayon.

于 2013-02-24T07:30:02.703 回答
0

我有个主意。你可以使用它,如果你认为它没问题。

1. Scan line by line:
    a. Look for \[crayon.+\] this pattern
    b. if you don't find this pattern then write the line as it present
    c. if you find this pattern then don't write anything and look for \[\/crayon\] this pattern
    d. until you find this pattern write every line by adding 4 spaces beginning of it.
    e. when you find (c) specified pattern then don't write anything and again start from (a)
于 2013-02-24T08:12:12.513 回答
-1

怎么样\[crayon.*?\]\n(.*\n)*?\[\/crayon\]\n。这种方式\1可以捕获每一行。

于 2013-02-24T07:33:45.687 回答