0

ネストされたタグも一致させたいので、以下の正規表現を改善しようとしています:

'%{if:\s*"\'([^\']*)\' == \'([^\']*)\'"}((?:(?!{else}|{/endif}).)*){else}((?:(?!{/endif}).)*){/endif}%sei'

基本的に一致するもの:

{if: "'x' == 'y'"}
    a
{else}
    b
{/endif}

また

{if: "'x' == 'y'"}
    c
{/endif}

ただし、これを何らかの方法で再帰的にしたいので、ネストされたステートメントも何も壊さずに一致させることができます(現時点では、ネストされたステートメントが追加されると壊れます)。

にも同様の表現があり!=ます。

タグに一致するこのhttp://www.devnetwork.net/viewtopic.php?f=38&t=102670&sid=02b7c691a2be894336c694700f8f911a#p551340を見つけましたが<div>、正規表現に合わせて適応させる方法が少しわかりません...

4

2 に答える 2

0

ネストを所定の深さに制限する場合 (これは悪い考えかもしれませんし、そうでないかもしれません)、正規表現と一致させることができます。そうしないと、できません。あなたが提供したリンクは、HTML と正規表現を一致させます。これはよく使用されますが、一般的に悪い考えであることが知られています。他の形式の解析を使用したくない場合は、最も内側の if を照合し、何かに置き換えて、再度照合することを検討してください。

于 2012-05-22T12:10:48.673 に答える
0

正規表現 (PCRE) の使用は、ネストされたレベルごとに内部コンテンツを再解析する必要があるような場合には最適ではありません (適切なパーサーを使用する方がよい理由の 1 つです)。

つまり、次のようなパターンで実行できます。

~
{if:\s*+
    (?<condition>
        [^{}]++
    )
}

(?<then>
    (?:
        (?:(?!{if:[^{}]++}|{else}|{/endif}).)*+
        (?R)*+
    )*+
)

(?:
    {else}
    (?<else>
        (?:
            (?:(?!{if:[^{}]++}|{else}|{/endif}).)*+
            (?R)*+
        )*+
    )
)?+

{/endif}
~six

Perl の例@ideone .

このテキストについて

if: "'x' == 'y'"}
    a
{else}
    b
{/endif}

{if: "'x' == 'y'"}
    c
{/endif}

{if:minimal}{else}{/endif}

{if: "'nested' == 'things'"}
    {if: "'x' == 'y'"}x{if:minimal}{else}{/endif}x{/endif}
{else}
    b{if: "'x' == 'y'"}c{/endif}{if: "'x' == 'y'"}c{/endif}
{/endif}

{if:foo} unbalanced {if:bar}ignores first if{/endif}

一致する

*** matched if:
  * cond: "'x' == 'y'"
  * then:
    a

  * else:
    b

*** matched if:
  * cond: "'x' == 'y'"
  * then:
    c

*** matched if:
  * cond: minimal
  * then:
  * else:
*** matched if:
  * cond: "'nested' == 'things'"
  * then:
    {if: "'x' == 'y'"}x{if:minimal}{else}{/endif}x{/endif}

  * else:
    b{if: "'x' == 'y'"}c{/endif}{if: "'x' == 'y'"}c{/endif}

*** matched if:
  * cond: bar
  * then: ignores first if
于 2012-05-22T12:31:26.837 に答える