#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
.