首页 > 解决方案 > 正则表达式:将日志消息格式化为 HTML 代码

问题描述

我有一个日志文件。我想将每个日志分成两组,这样我就可以用一些 HTML 标记来包装它们。

[25-Nov-2020 11:49:39 UTC] [Error] some error message.
{"good":"14"}
Stack trace:
#0 /Users/Sites/test/test.php(180)
[25-Nov-2020 11:49:39 UTC] [Info] some info message.
Array(
  some message
)

Stack trace:
#0 /Users/Sites/test/test.php(10)
#1 /Users/Sites/test/test.php(40)
#2 /Users/Sites/test/test.php(1500)

最终预期结果

<details>
    <summary>[25-Nov-2020 07:24:51 UTC] [Error] some error message.</summary>
    <pre>{"good":"14"}
Stack trace:
#0 /Users/Sites/test/test.php(180)</pre>
</details>
<details>
    <summary>[25-Nov-2020 07:24:51 UTC] [Info] some info message.</summary>
    <pre>Array(
  some message
)

Stack trace:
#0 /Users/Sites/test/test.php(10)
#1 /Users/Sites/test/test.php(40)
#2 /Users/Sites/test/test.php(1500)</pre>
</details>

到目前为止,我已经(?(?=\[.* UTC\].*)(\[.*)|(.*))在这个站点上进行了尝试,但我无法为每个日志获取两个组。我得到了很多组。我想如果我可以将每个日志分成两组,我可以添加必要的标签。

标签: phpregex

解决方案


您可以使用 2 个捕获组,并匹配方括号之间的 UTC 部分,而无需使用 if 子句或替代。

在更换使用组 1 和组 2。

^(\[[^][]*\hUTC].*)((?:\R(?!\[).*)*)

解释

  • ^字符串的开始
  • (捕获组 1
    • \[[^][]*\hUTC].*匹配[, thenUTC]和该行的其余部分
  • )关闭组 1
  • (捕获组 2
    • (?:\R(?!\[).*)*匹配所有不以开头的行[
  • )关闭组 2

正则表达式演示


推荐阅读