一个(相对)简单的方法是分两步完成:
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
.