我需要一些幫助,因為我不是 PHP RegEx 專家。我在這里有這行文本,它總是相同的(除了最后的訊息):
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"
我有 3 個函式應該回傳日志條目的一部分:
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 {
}
我第一次嘗試使用帶有空格的爆炸作為分隔符,這有效但不是最好的方法,因為在某些情況下日志訊息可能很長。
我不是那個 RegEx 專家,但我找到了以下組合來匹配前兩部分: ([^\s] ) ([A-Z] )
這會回傳時間戳和級別。現在我正在努力在第二組之后獲得訊息 - 也許我的嵌套并不完美。任何建議都會讓我開心!
注意
該訊息將在日志記錄級別后的第一個空格之后開始。例如:
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"
uj5u.com熱心網友回復:
您可以使用 3 個捕獲組,其中第三個組包含該行的其余部分,然后是所有不以日期時間(如模式)開頭的行。
您可以使模式更具體地用于第 1 組,并匹配不以第 1 組模式開頭的其余行,您可以使用遞回第一個子模式 (?1)
^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\ \d{2}:\d{2})\h ([A-Z] )\h (.*(?:\R(?!(?1)).*)*)
在某些部分,模式匹配:
^字串的開始(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\ \d{2}:\d{2})捕獲組 1,匹配日期和時間類似模式\h匹配 1 個水平空白字符([A-Z] )捕獲第 2 組,匹配 1 個大寫字符 AZ\h匹配 1 個水平空白字符(捕獲組 3.*匹配其余的ine(?:\R(?!(?1)).*)*可選地重復匹配換行符和行的其余部分,斷言當前位置右側的內容與子模式 1(模式組 1)不匹配
)關閉第 3 組
請參閱正則運算式演示和PHP 演示。
例如有 2 行,都以相同的模式開始:
$re = '/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\ \d{2}:\d{2})\h ([A-Z] )\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);
}
輸出
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.
"
)
uj5u.com熱心網友回復:
這是一個簡單的方法explode()及其限制引數。
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.""
*/
只要訊息之前的空格是恒定的,并且它之前的任何部分都不能包含空格,這將起作用。如果訊息之前的任何部分有時有空格,那么這將無法始終如一地作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/377498.html
上一篇:正則運算式后視中的可選模式部分
下一篇:用于c#中名稱驗證的RegEx
