0

我定义了一个这样的日志格式字符串:

[%Time%] %Logger%.%Level%: %Message% ${$%Context%$}$ $\n$%Extra%\n

除了替换 %-Keys 之外,我还希望能够在 %Context%-Key 附近定义条件:

因此如果 %Context% 为空,则跳过完整的 ${$%Context%$}$ 如果 %Context% 不为空,还打印前缀 { 和后缀 }

我试过这个(我计划在一个循环中替换键):

$output = '';
$subject = '[%Time%] %Logger%.%Level%: %Message% ${$%Context%$}$ $\n$%Extra%\n';
$output .= preg_replace('/(\$(.*|^\$)\$)?%Context%(\$(.*|^\$)\$)?/', '\2test\4', $subject);

我的期望(上下文为空):

[%Time%] %Logger%.%Level%: %Message% $\n$%Extra%\n

我的期望(上下文不为空):

[%Time%] %Logger%.%Level%: %Message% {test} $\n$%Extra%\n

我得到的(上下文不为空):

[%Time%] %Logger%.%Level%: %Message% {test}$ $\n%Extra%\n

而且我不知道最后一美元是从哪里来的。

4

1 回答 1

0

这是一种解决方案 - 我使用循环和 if 条件来解决我的问题:

$output = '';
$subject = '[%Time%] %Logger%.%Level%: %Message% ${$%Context%$}$ $\n$%Extra%\n';
$replace = array('Hello', 'World', '');
$pattern = '/(\${1}([^\$]+)\${1})?%Context%(\${1}([^\$]+)\${1})?/';

foreach ($replace as $r)
{
    if ($r == '')
    {
        $output .= preg_replace($pattern, '', $subject) . '<br>';
    }
    else
    {
        $output .= preg_replace($pattern, '$2' . $r . '$4', $subject) . '<br>';
    }
}

输出:

[%Time%] %Logger%.%Level%: %Message% {Hello} $\n$%Extra%\n
[%Time%] %Logger%.%Level%: %Message% {World} $\n$%Extra%\n
[%Time%] %Logger%.%Level%: %Message% $\n$%Extra%\n
于 2013-09-05T11:56:58.963 回答