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}
)