我正在解析一个字符串,并在与其类型相对应的变量中分配字符串的每个部分:
e.g。
01:29:05 success login is successful : username
所以我必须这样做:
preg_match("/(1[012]|0[0-9]):[0-5][0-9]:[0-5][0-9]/", $str, $time);
echo $time[0];
现在我有时间。下一个是日志的status
。
preg_match("/success|failure|warning/", $str, $status);
echo $status[0];
问题是下一个$message
和$user
。 $user
是可选的,有些日志没有这个。 $message
,我只想在$status
之后和冒号:
之前获取字符串:
我对消息部分的尝试
preg_match(("/($status[0])+:*/"), $str, $message);
这可能是什么解决方案,或者可以有更简单的方法。
修改
所需的输出应如下所示:
array('
'time'=> '01:29:05',
'status'=> 'success',
'message'=> 'login is successful',
'user' => 'username'
')
答案 0 :(得分:1)
如果您的输出格式相同,请使用Preg_match_all
尝试使用此正则表达式模式([\d :]+)(\w+) ([a-zA-z ]+) : ([a-zA-z]+)
,您将在输出数组的相应索引上获得第一个,第二个和第三个匹配项
这样做
$input_line="01:29:05 success login is successful : username";
preg_match("/([\d :]+)(\w+) ([a-zA-z ]+) : ([a-zA-z]+)/", $input_line, $output_array);
print_r($output_array);
<强>输出强>
Array
(
[0] => 01:29:05 success login is successful : username
[1] => 01:29:05
[2] => success
[3] => login is successful
[4] => username
)
答案 1 :(得分:1)
当我准备答案时,已经接受了一个答案。无论如何,我把它放在这里。
preg_match("/(?P<time>\d{2}:\d{2}:\d{2}) (?P<status>\w*) (?P<message>[^:]*) : (?P<user>.*)/", $str, $results)
演示在这里Demo