带方括号的preg_split

问题描述 投票:1回答:1

我有一个具有以下结构的日志文件:

输入:

$logLine = "[2017-12-23 19:15:59:634187] [INFO] User SIMDesign successfully logged in."

我希望得到一个数组(使用preg_split或preg_match_all),如下所示:

预期产量:

[
 0 => '[2017-12-23 19:15:59:634187]',
 1 => '[INFO]',
 2 => 'User SIMDesign successfully logged in.'
]

或这个:

[
 0 => '2017-12-23 19:15:59:634187',
 1 => 'INFO',
 2 => 'User SIMDesign successfully logged in.'
]

尝试:

我已经尝试了几个小时找到一个正则表达式模式,但不幸的是我没有找到适合我的解决方案。

preg_split("/[][]/", $logLine);

[
    0   =>  '',                                         //this is empty
    1   =>  '2017-12-23 19:15:59:634187',
    2   =>  ' ',                                        //there is a space
    3   =>  'INFO',
    4   =>  ' User SIMDesign successfully logged in.',
]

输出没问题但不完美。我不需要数组的空元素([0],[2])。我需要在字符串“用户SIMDesign成功登录”之前删除空格。

preg_split("/[][]\s\S/", $logLine);

[
    0   =>  '[2017-12-12 12:12:12:132123',
    1   =>  'INFO',
    2   =>  'ser SIMDesign successfully logged in.'     //The first character of the string was removed (why?)
]

提前致谢

php regex pcre preg-split
1个回答
3
投票

首先,你想要第一组括号之间的信息,但由于这些是正则表达式的特殊字符,我们逃避它们:[(.*?)] - > \[(.*?)\]

$logLine = "[2017-12-23 19:15:59:634187] [INFO] User SIMDesign successfully logged in."
            ^--------------------------^

然后是第二个括号,相同的逻辑:[(.*?)] - > \[(.*?)\]

$logLine = "[2017-12-23 19:15:59:634187] [INFO] User SIMDesign successfully logged in."
                                         ^----^

而“其余的直到最后”是(.*)$

$logLine = "[2017-12-23 19:15:59:634187] [INFO] User SIMDesign successfully logged in."
                                                ^------------------------------------^

他们之间有空格(\s):\[(.*?)\]\s\[(.*?)\]\s(.*)$,有neat little demo here


我更喜欢上面写的答案,但preg_split页面还记录了一些可以与preg_split()一起传递的标志,其中一个是以下内容。我不是粉丝的原因是因为你“隐藏”了问题而不是修复它。

PREG_SPLIT_NO_EMPTY 如果设置了此标志,preg_split()将仅返回非空片段。

© www.soinside.com 2019 - 2024. All rights reserved.