简体   繁体   English

PHP Regex匹配以下字符串示例

[英]PHP Regex to match following string example

My subject looks like this: 我的主题看起来像这样:

[9] 20:30:40 [SUCCESS] s-a24:1337
2
8.87
4038047
35320
4002727
[10] 20:30:40 [SUCCESS] s-d28:1337
2
2.64
4038047
37363
4000684
[11] 20:30:40 [SUCCESS] s-b29:1337
2
0.56
4038047
33066
4004981
[66] 20:30:42 [FAILURE] s-b25:1337 Timed out, Killed by signal 9
2
1.16
4038047
35274
[67] 20:30:42 [FAILURE] s-b30:1337 Timed out, Killed by signal 9

I need to create a multi-dimentional array that will match 我需要创建一个匹配的多维数组

  • success/failure 成功/失败
  • descriptor (s-a24, s-d28, etc) 描述符(s-a24,s-d28等)
  • 5 rows of numbers that follow (can be any length) 跟随5行数字(可以是任意长度)

There could be anywhere from 0 to 5 rows (5 rows is SUCCESS) 可能有0到5行(5行是SUCCESS)

I'm absolutely inept in regex 我在正则表达式中绝对无能为力

What I started with is this, it does not work. 我开始的是这个,它不起作用。

preg_match_all("/\[[0-9]+\](.*?)\[[0-9]+\]/",$output,$array);

I am not sure a simple Regex is the way to go here, especially considering the variable count of data for each record. 我不确定一个简单的正则表达式是什么方式,特别是考虑到每个记录的数据的可变计数。

So, what about splitting the string up? 那么,拆分字符串怎么样?

By splitting it at every line break followed by a "[" and splitting each of the results at every line break you could evaluate each and every first line of a result with a simple regex and easily add the numerical data, if there is any. 通过在每个换行符之后将其拆分,然后在每个换行符处拆分每个换行符,您可以使用简单的正则表达式评估结果的每个第一行,并轻松添加数值数据(如果有的话)。

Regards STEFAN 关心STEFAN

This works for me: 这对我有用:

<?php

$str = '[9] 20:30:40 [SUCCESS] s-a24:1337
2
8.87
4038047
35320
4002727
[10] 20:30:40 [SUCCESS] s-d28:1337
2
2.64
4038047
37363
4000684
[11] 20:30:40 [SUCCESS] s-b29:1337
2
0.56
4038047
33066
4004981
[66] 20:30:42 [FAILURE] s-b25:1337 Timed out, Killed by signal 9
2
1.16
4038047
35274
[67] 20:30:42 [FAILURE] s-b30:1337 Timed out, Killed by signal 9';

preg_match_all("/^\[.*?\[(SUCCESS|FAILURE)\]\s(s\-\w\d{2}):1337.*?\n((.*\n){5})/m", $str, $matches, PREG_SET_ORDER);
//print_r($matches);
foreach ($matches as $match)
{
    echo $match[1] . "<br>\n";
    echo $match[2] . "<br>\n";
    echo $match[3] . "<br>\n";
}
?>

(\\[\\d*\\].*\\[(SUCCESS|FAILURE)\\]\\s(s-.{3}).*(\\r[\\d\\.]+){0,5})

http://regexr.com?30n45 http://regexr.com?30n45

This regex should work. 这个正则表达式应该工作。

Quick and dirty, but it was fun to try: 快速而肮脏,但尝试很有趣:

$success_pattern = '/\[(SUCCESS|FAILURE)\]/';
preg_match_all($success_pattern, $subject, $success_matches);

$descriptor_pattern = '/\[(SUCCESS|FAILURE)\]\s(.+?):/';
preg_match_all($descriptor_pattern, $subject, $descriptor_matches);

$numbers_pattern = '/\[.*?\n((\d+\.{0,1}\d*\n)+)/';
preg_match_all($numbers_pattern, $subject, $numbers_matches);

$output = array();
for($x = 0; $x < count($success_matches[0]); $x++) {
    $output[] = array(
        'success' => $success_matches[1][$x],
        'descriptor' => $descriptor_matches[2][$x],
        'numbers' => explode("\n", trim($numbers_matches[1][$x]))
    );
}

How about: 怎么样:

$string = '[9] 20:30:40 [SUCCESS] s-a24:1337
2
8.87
4038047
35320
4002727
[10] 20:30:40 [SUCCESS] s-d28:1337
2
2.64
4038047
37363
4000684
[11] 20:30:40 [SUCCESS] s-b29:1337
2
0.56
4038047
33066
4004981
[66] 20:30:42 [FAILURE] s-b25:1337 Timed out, Killed by signal 9
2
1.16
4038047
35274
[67] 20:30:42 [FAILURE] s-b30:1337 Timed out, Killed by signal 9
';

preg_match_all("/\[.*?\[(SUCCESS|FAILURE)\]\s+([^:]+):[^\n]+\n(?:([^[]+?)\n)?(?:([^[]+?)\n)?(?:([^[]+?)\n)?(?:([^[]+?)\n)?(?:([^[]+?)\n)?/m", $string, $matches, PREG_SET_ORDER);
print_r($matches);

output: 输出:

Array
(
    [0] => Array
        (
            [0] => [9] 20:30:40 [SUCCESS] s-a24:1337
2
8.87
4038047
35320
4002727

            [1] => SUCCESS
            [2] => s-a24
            [3] => 2
            [4] => 8.87
            [5] => 4038047
            [6] => 35320
            [7] => 4002727
        )

    [1] => Array
        (
            [0] => [10] 20:30:40 [SUCCESS] s-d28:1337
2
2.64
4038047
37363
4000684

            [1] => SUCCESS
            [2] => s-d28
            [3] => 2
            [4] => 2.64
            [5] => 4038047
            [6] => 37363
            [7] => 4000684
        )

    [2] => Array
        (
            [0] => [11] 20:30:40 [SUCCESS] s-b29:1337
2
0.56
4038047
33066
4004981

            [1] => SUCCESS
            [2] => s-b29
            [3] => 2
            [4] => 0.56
            [5] => 4038047
            [6] => 33066
            [7] => 4004981
        )

    [3] => Array
        (
            [0] => [66] 20:30:42 [FAILURE] s-b25:1337 Timed out, Killed by signal 9
2
1.16
4038047
35274

            [1] => FAILURE
            [2] => s-b25
            [3] => 2
            [4] => 1.16
            [5] => 4038047
            [6] => 35274
        )

    [4] => Array
        (
            [0] => [67] 20:30:42 [FAILURE] s-b30:1337 Timed out, Killed by signal 9

            [1] => FAILURE
            [2] => s-b30
        )

)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM