任何类型字符的php regexp

任何类型字符的php regexp,regex,Regex,我使用这种模式: '/({for) (\d+) (times})([\w+\d+{}]{0,})({endfor})/i' 转化 {for 3 times}App2{endfor} 在 但这不适用于: {for 7 times} App2 {endfor} 这是我非常小的模板引擎的一小部分。 只是为了好玩 不起作用=(.如果您的字面意思是(…),则该组正好匹配三个字符。(.+)将匹配任何字符中的一个或多个,但 默认情况下,匹配除换行符以外的任何内容 s(PCRE\u DOTAL

我使用这种模式:

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

{for 3 times}App2{endfor}

但这不适用于:

{for 7 times}
    App2
{endfor}

这是我非常小的模板引擎的一小部分。

只是为了好玩


不起作用=(.

如果您的字面意思是
(…)
,则该组正好匹配三个字符。
(.+)
将匹配任何字符中的一个或多个,但


默认情况下,
匹配除换行符以外的任何内容

s(PCRE\u DOTALL)
如果设置了此修饰符,则模式中的点元字符将匹配所有字符,包括换行符。如果未设置此修饰符,则将排除换行符

使用允许
匹配换行符

/您的模式/s

示例(也包括):

$str=7
[3] =>次}
[4] => 
附件2
[5] =>{endfor}
)

旁注:大多数元字符在字符类中失去特殊意义,因此您允许使用literal
+
字符。假设您不打算接受文本
+
字符,
[\w+\d+{}]{0,}
似乎等同于
[\w{}]*
(因为
*
意味着
{0,}
\d
包含在
\w
中)。没问题,但是我想理解为什么不使用两个,比如:$str=Ok:我不需要再创建一个模板引擎。这工作只是为了好玩。谢谢你,聪明人。@SimoneDemoGentili谢谢。要回答您的问题,
preg_match()
只匹配一次;您希望对多个匹配使用
preg\u match\u all()
。此外,您还可以将通配符
(.+)
设置为像这样的
(.+)
惰性(ungreedy),这样它就不会匹配太多。看。@SimoneDemoGentili为了好玩而做实验是很好的学习!:-)顺便说一下,对于单个正则表达式来说,模板引擎之类的东西可能太复杂了,因此您最好为它编写自己的解析器/标记器。您使用preg_match*函数而不是preg_replace。为什么?你建议我通过预赛*?
{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'