任何类型字符的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'