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

2024-04-30

有一天,我又要怀疑自己的理智了……

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

$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? https://stackoverflow.com/questions/18988536/php-regex-how-to-match-r-and-n-without-using-r-n/18992691#18992691

但要回答你的问题,除了\r and \nPCRE 还有另一个匹配换行符的字符组,您可以在这种情况下使用一个漂亮的转义序列,即\R.

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

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

Output

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] => 

)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式与换行符不匹配 的相关文章

随机推荐