PHP正则表达式有条件

时间:2013-09-04 14:59:28

标签: php regex conditional-statements

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

[%时间%]%记录器%。%等级%:%消息%$ {$%上下文%$} $ $ \ n $%额外%\ 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

我不知道最后一笔来自哪里。

1 个答案:

答案 0 :(得分: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