Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

251
Views
Analizar la entrada de registro con expresiones regulares en varias partes

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"

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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 3

Vea 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. " )
over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!