Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式在单词后获取字符串的一部分_Php_Regex - Fatal编程技术网

Php 正则表达式在单词后获取字符串的一部分

Php 正则表达式在单词后获取字符串的一部分,php,regex,Php,Regex,我正在分析一个字符串,并将该字符串的每个部分分配到与其类型对应的变量中: 例如 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]; 现在我有时间了。下一个是日志的状态 preg_match("/success|failure|warning/", $str, $st

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

例如

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];
现在我有时间了。下一个是日志的
状态

preg_match("/success|failure|warning/", $str, $status);
echo $status[0];
问题是下一个
$message
$user
$user
是可选的,有些日志没有此选项。对于
$消息
,我只想获取
$状态
后面和冒号前面的字符串

我对消息部分的尝试

preg_match(("/($status[0])+:*/"), $str, $message);
有什么办法可以解决这个问题,或者有更简单的方法

编辑

Array
(
    [0] => 01:29:05 success login is successful : username
    [1] => 01:29:05 
    [2] => success
    [3] => login is successful 
    [4] => username
)
所需的输出应如下所示:

array('
   'time'=> '01:29:05',
   'status'=> 'success',
   'message'=> 'login is successful',
   'user' => 'username'
')

如果输出的格式相同,则使用

尝试使用此正则表达式模式
([\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
)

当我准备答案时,一个已经被接受了。不管怎样,我把它放在这里了

preg_match("/(?P<time>\d{2}:\d{2}:\d{2}) (?P<status>\w*) (?P<message>[^:]*) : (?P<user>.*)/", $str, $results)
preg_match(“/(?P\d{2}:\d{2}:\d{2})(?P\w*)(?P[^:]*):(?P.*)/”,$str,$results)
解释
  • 结果数组将附加到位置匹配1、2、3和4中,其中包含键“时间”、“状态”、“消息”和“用户”。优点是在修改表达式时,不再需要考虑捕捉位置

演示在这里

个人比赛应该是什么样子。你能在你的问题中包括吗?好的,我添加了所需的输出,将其保存在数组中是不必要的。问题是我没有得到
$status
,考虑到我提到的所需结果,我想这确实是最适合这个问题的