(比較的)簡単な方法は、2つのステップでそれを行うことです。
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
他のテキスト
int main()
{{
}
おそらく簡潔な正規表現の簡単な説明^(?=(?:(?!\[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
平易な英語でそれは読むでしょう:
このline-startの前にあり、このline-startと その間にある場合にのみ、行の任意の開始に一致します。[/crayon]
[/crayon]
[crayon