Tengo esta línea de texto aquí, que siempre será la misma (excepto el mensaje al final):
2021-12-08T18:18:38+00:00 INFO Produktbestand erfolgreich von Collmex abgerufen | "STOCK_AVAILABLE;23;1;363;PCE;-1\r\nMESSAGE;S;204020;Daten?bertragung erfolgreich. Es wurden 1 Datens?tze verarbeitet.\r\n"Tengo 3 funciones que deberían devolver partes de la entrada de registro:
public function get_log_file_entry_time( string $entry ): string { } public function get_log_file_entry_level( string $entry ): string { } public function get_log_file_entry_message( string $entry ): string { }Primero intenté usar explotar con un espacio en blanco como delimitador, que funciona, pero no es la mejor manera, ya que el mensaje de registro puede ser muy largo en algunos casos.
No soy tan experto en expresiones regulares, pero encontré la siguiente combinación para que coincida con las dos primeras piezas: ([^\s]+) ([AZ]+)
Esto me devuelve la marca de tiempo y el nivel. Ahora estoy luchando por captar el mensaje después del segundo grupo; tal vez mi anidamiento no sea perfecto en absoluto. ¡Cualquier consejo me haría feliz!
darse cuenta
El mensaje comenzará después del primer espacio en blanco después del nivel de registro. Por ejemplo:
Produktbestand erfolgreich von Collmex abgerufen | "STOCK_AVAILABLE;23;1;363;PCE;-1\r\nMESSAGE;S;204020;Daten?bertragung erfolgreich. Es wurden 1 Datens?tze verarbeitet.\r\n"
Puede usar 3 grupos de captura, donde el tercer grupo contiene el resto de la línea, seguido de todas las líneas que no comienzan con un patrón de fecha y hora.
Puede hacer que el patrón sea un poco más específico para el grupo 1, y para que coincida con el resto de las líneas que no comienzan con el patrón del grupo 1, puede repetir el primer subpatrón usando (?1)
^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2})\h+([AZ]+)\h+(.*(?:\R(?!(?1)).*)*)En partes, el patrón coincide:
^ Comienzo de cadena(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2}) Capture el grupo 1 , haga coincidir una fecha y hora como patrón\h+ Combina 1+ caracteres de espacios en blanco horizontales([AZ]+) Grupo de captura 2 , partido 1+ caracteres en mayúscula AZ\h+ Combina 1+ caracteres de espacios en blanco horizontales( Grupo de captura 3.* Coincidir con el resto de la línea(?:\R(?!(?1)).*)* Opcionalmente, repita la coincidencia de una nueva línea y el resto de la línea afirmando que lo que está directamente a la derecha de la posición actual no coincide con el subpatrón 1 (el grupo de patrones 1)) Cerrar grupo 3Vea una demostración de expresiones regulares y una demostración de PHP .
Por ejemplo, con 2 líneas, ambas comenzando con el mismo patrón:
$re = '/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2})\h+([AZ]+)\h+(.*(?:\R(?!(?1)).*)*)/m'; $str = '2021-12-08T18:18:38+00:00 INFO Produktbestand erfolgreich von Collmex abgerufen | "STOCK_AVAILABLE;23;1;363;PCE;-1 MESSAGE;S;204020;Daten?bertragung erfolgreich. Es wurden 1 Datens?tze verarbeitet. " 2021-12-08T18:18:38+00:00 INFO Produktbestand erfolgreich von Collmex abgerufen | "STOCK_AVAILABLE;23;1;363;PCE;-1 MESSAGE;S;204020;Daten?bertragung erfolgreich. Es wurden 1 Datens?tze verarbeitet. "'; preg_match_all($re, $str, $matches, PREG_SET_ORDER); foreach ($matches as $match) { print_r($match); }Producción
Array ( [0] => 2021-12-08T18:18:38+00:00 INFO Produktbestand erfolgreich von Collmex abgerufen | "STOCK_AVAILABLE;23;1;363;PCE;-1 MESSAGE;S;204020;Daten?bertragung erfolgreich. Es wurden 1 Datens?tze verarbeitet. " [1] => 2021-12-08T18:18:38+00:00 [2] => INFO [3] => Produktbestand erfolgreich von Collmex abgerufen | "STOCK_AVAILABLE;23;1;363;PCE;-1 MESSAGE;S;204020;Daten?bertragung erfolgreich. Es wurden 1 Datens?tze verarbeitet. " ) Array ( [0] => 2021-12-08T18:18:38+00:00 INFO Produktbestand erfolgreich von Collmex abgerufen | "STOCK_AVAILABLE;23;1;363;PCE;-1 MESSAGE;S;204020;Daten?bertragung erfolgreich. Es wurden 1 Datens?tze verarbeitet. " [1] => 2021-12-08T18:18:38+00:00 [2] => INFO [3] => Produktbestand erfolgreich von Collmex abgerufen | "STOCK_AVAILABLE;23;1;363;PCE;-1 MESSAGE;S;204020;Daten?bertragung erfolgreich. Es wurden 1 Datens?tze verarbeitet. " )Aquí hay un método simple con explode() y su parámetro de límite.
list($date, $severity, $message) = explode(' ', $str, 3); var_dump($date, $severity, $message); /* string(25) "2021-12-08T18:18:38+00:00" string(4) "INFO" string(170) "Produktbestand erfolgreich von Collmex abgerufen | "STOCK_AVAILABLE;23;1;363;PCE;-1 MESSAGE;S;204020;Daten?bertragung erfolgreich. Es wurden 1 Datens?tze verarbeitet."" */Siempre que los espacios antes del mensaje sean constantes, y ninguna de las partes que conducen a él puede contener espacios, esto funcionará. Si alguna parte antes del mensaje tiene espacios algunas veces , esto no funcionará de manera consistente.