PHP регулярное выражение для любого типа персонажа

Я использую этот шаблон:

'/({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'

не работает =(.

1 ответ

Решение

Если вы буквально имеете в виду (...)это группа, которая соответствует ровно трем символам. (.+) будет соответствовать одному или нескольким любым символам, кроме...


По умолчанию, . соответствует чему угодно, кроме перевода строки.

s (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}
)
Другие вопросы по тегам