【问题标题】:splitting a string into an array with php用php将字符串拆分为数组
【发布时间】:2014-07-07 13:20:33
【问题描述】:

我将如何将以下格式字符串拆分为数组?

[13:05:37] [Server thread/INFO]: [0;35;1m[Server[0;35;1m] hi[m

字符串格式来自我的工艺服务器,我相信格式是

[time] [thread info]: ANSICOLOROPEN[stringANSICOLORCLOSE] string EOL

我怎么能把它拆分成数组

[0]time 
[1]thread info
[3]ansi open
[4]string
[5]ansi close
[6]string 
[7]EOL marker

【问题讨论】:

  • 您的示例中的 stringANSICOLORCLOSE 是什么?请显示您的示例中的值对应于哪些字段。
  • color close is [0;35;1m as is ansi open
  • 你能给出所有必要的值吗,必须为你的例子解析:它很复杂 - 有不匹配的括号
  • 据我了解,[time] 是格式为 xx:xx:xx[threadinfo]: 的时间,是一个以 : 结尾的字符串,它变得奇怪的是 [0;35;1m[server[ 0;35;1m] hi [m 两次出现 [0;35;1m 之间的所有内容都是彩色文本,而 [m 是行尾,因此 [0;35;1m[server[0;35;1m] hi 将呈现as [server] hi with [server] 是紫色文本
  • @Jamesp1989 你已经check this out了吗?

标签: php arrays regex


【解决方案1】:

我倾向于首先在空间上分解这些类型的日志条目,然后在索引值中进行硬编码,因为它们往往不会改变。例如:

$log_line = "[13:05:37] [Server thread/INFO]: [0;35;1m[Server[0;35;1m] hi[m";
$line_parts = explode(" ",$log_line);

$log_data = array(
 'time' => $line_parts[0],
 'thread_info' => $line_parts[1],
 'somethingansirelated' => $line_parts[2]
);

从这里以各种方式进一步清理各种日志数据要容易得多,例如您可以使用array_map:

array_map( function( $a ){
  // trim, format, validate, etc.

}, $log_data );

不确定这是否会被视为未回答,但它可能会有所帮助,所以你去吧。

【讨论】:

    【解决方案2】:

    您可以尝试使用正则表达式获取括号括起来的所有项目,例如:

    $re = "/\[([^\]]+)\]/"; 
    $str = "[13:05:37] [Server thread/INFO]: [0;35;1m[Server[0;35;1m] hi[m]"; 
    
    preg_match_all($re, $str, $matches);
    

    然后您可以遍历 $matches 变量,该变量是用于您的字符串的模式的可能匹配的数组。

    preg_match_all

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多