2013-09-04 3 views
0

я определил формат журнала строку, как это:PHP Regex с условиями

[% Время%]% Logger%% Уровень.%:% Сообщение% $ {$% Context% $} $ $ \ п $% Extra% \ п

Дополнительно к замене% -Keys я хочу, чтобы иметь возможность определить условия, как вблизи% Context% -Key:

Так что если% Context% пуст, пропустите полный $ {$ % Контекст% $} $ Если% Контекст% не пуст, также печатайте префикс {и суффикс}

Я пробовал это (я планировал перепланировать се ключи внутри цикла):

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

Что я ожидаю (Context пусто):

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

Что я ожидаю (контекст не пуст):

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

Что я получаю (Контекст не пуст):

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

И я не знаю, где t он последний доллар.

+0

Я попробовал это в обоих [jsFiddle] (HTTP://jsfiddle.net/8uN9y/) и в php, и оба раза он возвращался без $ ... и без фигурных скобок в jsFiddle (но это менее актуально, я подозреваю). Мой php-выход из вашего кода: '[% Time%]% Logger%.% Level%:% Message% {test}% Extra% \ n' – Ross

+0

Я получаю тот же результат, что и Росс [Regex101] (http: //regex101.com/r/tB3eQ7) ... 'If% Context% не пуст, также печатайте префикс {и суффикс}' => не могли бы вы вывести ожидаемый результат в этом случае ... – Enissay

+0

Это очень странно, я пробовал с PHP 5.2 и 5.4. Я отредактировал сообщение выше –

ответ

0

Вот одно решение - я использую петли и, если условие, чтобы решить мою проблему:

$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 
Смежные вопросы