Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

252
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda