2

ブログをマークダウンから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

(比較的)簡単な方法は、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

于 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 に答える