Как я могу получить этот вывод регулярного выражения?

#php #regex

#php #регулярное выражение

Вопрос:

У меня проблема с моим регулярным выражением в php. Мне это нужно для некоторой оценки, и было бы намного проще, если бы я мог изменить это регулярное выражение вправо. Конечный массив, с помощью которого я конвертирую json_encode в JSON-файл.

Я уже перепробовал много разных регулярных выражений, но у меня никогда не получается правильный вывод. Теперь я получаю что-то вроде этого:

 [
    [
    "234445 01:00:34.423 ineedhelpineedhelpineedhelppls",
    "234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid",
    ],
    [
    "234445 ",
    "234445 "
    ],
    [
    "01:00:34.423",
    "01:00:34.423"
    ],
    [
    "ineedhelpineedhelpineedhelppls",
    "sdfkkdkkddddddsdfsdfiieuwrepid"
    ]

]
  

Мое регулярное выражение выглядит следующим образом:
preg_match_all('/(^d s)(01:w Sw Sw )(s. )/im', $data, $matches)

Если бы что-то подобное было действительно хорошо:

 [
    [
    "234445 01:00:34.423 ineedhelpineedhelpineedhelppls",
    "234445",
    "01:00:34.423",
    "ineedhelpineedhelpineedhelppls"
    ],
    [
    "234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid",
    "234445 ",
    "01:00:34.423",
    "sdfkkdkkddddddsdfsdfiieuwrepid"
    ]

]
  

Файл .log выглядит примерно так:

 234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid
234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid
234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid
234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid
234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid
234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid
234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid
234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid
234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid
234443 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid
  

Комментарии:

1. Пожалуйста, не пытайтесь использовать regex для синтаксического анализа JSON. Вместо этого используйте правильный анализатор JSON.

2. @TimBiegeleisen Я не разбираю JSON, я разбираю файл .log

3. Это длинный файл журнала? Не могли бы вы поделиться им здесь, чтобы мы тоже могли его протестировать.

4. @R.CanserYanbakan Я мог бы предоставить вам аналогичный файл с другими данными

5. @R.CanserYanbakan Я редактирую его

Ответ №1:

Вам просто нужно использовать PREG_SET_ORDER флаг, чтобы preg_match_all :

 $data = '234445 01:00:34.423 ineedhelpineedhelpineedhelppls
234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid';
preg_match_all('/(^d s)(d :w Sw Sw )(s. )/im', $data, $matches, PREG_SET_ORDER);
print_r($matches);
  

Вывод:

 Array (
  [0] => Array (
    [0] => 234445 01:00:34.423 ineedhelpineedhelpineedhelppls
    [1] => 234445
    [2] => 01:00:34.423
    [3] => ineedhelpineedhelpineedhelppls
  )
  [1] => Array (
    [0] => 234445 03:04:24.932 sdfkkdkkddddddsdfsdfiieuwrepid
    [1] => 234445
    [2] => 03:04:24.932
    [3] => sdfkkdkkddddddsdfsdfiieuwrepid
  )
)
  

Обратите внимание, что вам также необходимо изменить 01 в вашем регулярном выражении на d , чтобы соответствовать времени, начинающемуся с, например, 03 .

Демонстрация на 3v4l.org