正则表达式之后获取字符串的一部分

时间:2014-04-12 10:49:21

标签: php regex

我正在解析一个字符串,并在与其类型相对应的变量中分配字符串的每个部分:

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'
')

2 个答案:

答案 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);

Demo

<强>输出

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)

解释

  • 结果数组除了位置匹配1,2,3和4包含键&#34;时间&#34;,&#34;状态&#34;,&#34;消息&#34;和&#34;用户&#34;。当您修改表达式时,优势是不再需要考虑捕获位置!

演示在这里Demo