任何类型的字符的PHP正则表达式

时间:2012-11-27 22:02:19

标签: regex

我使用这种模式:

'/({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 个答案:

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