正则表达式与换行符不匹配


Regex doesn't match line break

这几天我又要质疑我的理智了…

我不明白为什么我的正则表达式拒绝匹配可选的换行符。代码:

$string = 'this is some template {$code}. nice! 
{$varinnewline}
{if $bla}1{else}2{/if}
';
echo "<pre>";
preg_replace_callback("/'{([^'}]*)'}('r'n)?/Us", function($matches) {
  print_r($matches);
}, $string);

它产生(除其他外)如下输出:

Array
(
    [0] => {$varinnewline}
    [1] => $varinnewline
)

而不是这个(如果我删除0-1匹配?在正则表达式的末尾):

Array
(
    [0] => {$varinnewline}
    [1] => $varinnewline
    [2] => 
)

基本上我想要一个匹配行尾'r'n的正则表达式,如果它是可用的。(我需要这个,因为在把{}转换成后面的新行似乎被php解释器删除了)

看看我之前回答的一个解释这个的帖子。

    如何匹配'r和'n而不使用['r'n]?

但是要回答您的问题,除了'r'n, PCRE还有另一个匹配换行符的字符组,您可以使用一个漂亮的转义序列来处理这种情况,即'R

'R匹配通用换行符;也就是说,任何被Unicode认为是换行序列的东西。这包括所有由'v(垂直空白)和多字符序列'x0D'x0A匹配的字符。

preg_replace_callback("~'{([^'}]*)'}('R)?~", function($matches) {
    print_r($matches);
}, $string);

输出
Array
(
    [0] => {$code}
    [1] => $code
)
Array
(
    [0] => {$varinnewline}
    [1] => $varinnewline
    [2] => 
)
Array
(
    [0] => {if $bla}
    [1] => if $bla
)
Array
(
    [0] => {else}
    [1] => else
)
Array
(
    [0] => {/if}
    [1] => /if
    [2] => 
)