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

时间:2014-05-12 15:27:27

标签: php regex

有一天,我将再次质疑我的理智......

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

$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匹配的正则表达式(如果可用)。 (我需要这个,因为在将{}转换为&lt;?php?&gt;之后,?&gt;之后的新行似乎被php解释器删除了)

1 个答案:

答案 0 :(得分:3)

看一篇帖子,我回答了一段时间后再解释这个。

但是要回答你的问题,除了\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] => 

)