-1

次のような文字列があります。

[if-abc] 12345 [if-def] 67890 [/if][/if]

次の正規表現があります。

/\[if-([a-z0-9-]*)\]([^\[if]*?)\[\/if\]/s

これは、私が望むように内側の括弧と一致します。しかし、67890 をテキスト (つまり abcdef) に置き換えると、一致しません。

[if-abc] 12345 [if-def] abcdef [/if][/if]

別の開き括弧を除いて、改行を含む任意の文字に一致できるようにしたい[if-.

4

3 に答える 3

1

この部分は、あなたが思うようには機能しません:

[^\[if]

[これは、 、iまたはのいずれでもない単一の文字に一致しfます。組み合わせは問いません。ただし、否定的な先読みを使用して、目的の動作を模倣できます。

~\[if-([a-z0-9-]*)\]((?:(?!\[/?if).)*)\[/if\]~s

また、ルックアヘッドに終了タグを含めました。これにより、貪欲な繰り返し (通常はパフォーマンスが低下します) を回避できます。さらに、パターン内でスラッシュをエスケープする必要がないように、区切り記号を変更しました。

((?:(?!\[/?if).)*)したがって、これは説明された興味深い部分です。

(         # capture the contents of the tag-pair
  (?:     # start a non-capturing group (the ?: are just a performance
          # optimization). this group represents a single "allowed" character
    (?!   # negative lookahead - makes sure that the next character does not mark
          # the start of either [if or [/if (the negative lookahead will cause
          # the entire pattern to fail if its contents match)
      \[/?if
          # match [if or [/if
    )     # end of lookahead
    .     # consume/match any single character
  )*      # end of group - repeat 0 or more times
)         # end of capturing group
于 2013-05-02T19:54:43.693 に答える
0

少し変更すると、次のようになります。

/\[if-([a-z0-9-]+)\](.+?)(?=\[if)/s

実行中[if-abc] 12345 [if-def] abcdef [/if][/if]

最初の一致は次のようになります。[if-abc] 12345

あなたのグループは:abc12345

そしてさらに変更:

/\[if-([a-z0-9-]+)\](.+?)(?=(?:\[\/?if))/s

両方のグループに一致します。区切り文字[/if]はこれらのいずれによってもキャプチャされませんが。

注:区切り文字を一致させる代わりに、正規表現で先読み ( (?=)) を使用して、先読みテキストが先読みと一致したときに停止しました。

于 2013-05-02T19:52:28.927 に答える