0

私はこのパターンを使用します:

'/({for) (\d+) (times})([\w+\d+{}]{0,})({endfor})/i'

変換する

{for 3 times}App2{endfor}

App2  App2  App2 

ただし、これは次の場合には機能しません。

{for 7 times}
    App2
{endfor}

これは私の非常に小さなテンプレート エンジンの一部です。

それはただの楽しみのためです

$mactos = Array(
    '/({for) (\d+) (times})([\w+\d+{}]{0,})({endfor})/i' => '<?php for($i=0;$i<${2};$i++) : ?> ${4} <?php endfor; ?' . '>',
    '/({{)(\w+)(}})/i' => '<?php echo $${2}; ?' . '>'
);
$php = file_get_contents('teamplate.php');
foreach ($this->getPatternAndReplacement() as $pattern => $replacement) {
    $php = preg_replace($pattern, $replacement, $php);
}

私はそれを読んだ (...)

'/({for) (\d+) (times})(...)({endfor})/i'

動作しません =(。

4

1 に答える 1

2

文字通り を意味する場合(...)、それは正確に 3 文字に一致するグループです。(.+)... を除く任意の文字の 1 つ以上と一致します。


デフォルトでは、改行以外.のすべてに一致します。

■ (PCRE_DOTALL)
この修飾子が設定されている場合、パターン内のドット メタ文字は、改行を含むすべての文字と一致します。それがない場合、改行は除外されます。

s修飾子を使用して、.改行文字の一致を許可します。

/your pattern/s

例(こちらも)

$str = <<<STR
{for 7 times}
    App2
{endfor}
STR;

preg_match('/({for) (\d+) (times})(.+)({endfor})/s', $str, $matchParts);

print_r($matchParts);
OUTPUT:

Array
(
    [0] => {for 7 times}
    App2
{endfor}
    [1] => {for
    [2] => 7
    [3] => times}
    [4] => 
    App2

    [5] => {endfor}
)
于 2012-11-27T22:06:59.313 に答える