我使用这种模式:
'/({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'
不起作用=(。
答案 0 :(得分:2)
如果你的字面意思是(...)
,那就是一个只匹配三个字符的组。 (.+)
将匹配任何字符中的一个或多个,但...
默认情况下,.
匹配除换行符之外的任何内容。
s(PCRE_DOTALL)
如果设置了此修饰符,则模式中的点元字符将匹配所有字符,包括换行符。没有它,排除了换行符。
使用s
modifier允许.
匹配换行符。
/your pattern/s
示例(也是here):
$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}
)