ဆာဗာမှတ်တမ်းဖိုင်များပြုပြင်သည့်အခါကျွန်ုပ်တို့သည်ပြ problems နာများကိုမကိုက်ညီသောပုံစံများဖြင့်ပြ problems နာများမကြာခဏကြုံတွေ့ရလေ့ရှိသည်။ ဥပမာအားဖြင့် IP address သည်ဇေလိုပြည်နယ်များရှိနိုင်ပြီး Timestamp Format သည်ကိုက်ညီမှုရှိနိုင်သည်။ ဤကွက်လပ်များကိုတူညီစွာကိုင်တွယ်နိုင်ရန်အတွက် Preg_replace_callback_array သည်ပုံမှန်ဖော်ပြချက်မျိုးစုံကိုသီးခြားစီဖော်ပြရန်ကွဲပြားခြားနားသော callback လုပ်ဆောင်ချက်များကိုဖြည့်ဆည်းပေးရန်ခွင့်ပြုသည့်အလွန်အစွမ်းထက်သောကိရိယာတစ်ခုဖြစ်သည်။
ဤဆောင်းပါးသည် Preg_replace_callback_array ကို အသုံးပြု. Prep နှင့် Time Fields ကို 0 တ်စုံတွင်တူညီသောပုံစံဖြင့်မည်သို့အသုံးပြုရမည်ကိုမိတ်ဆက်ပေးလိမ့်မည်။
ကျွန်ုပ်တို့တွင်အောက်ပါမှတ်တမ်းများ (ရိုးရှင်းသောဗားရှင်း) ရှိသည်ဆိုပါစို့။
127.000.000.001 - - [21/Apr/2025:15:32:01 +0000] "GET /index.php?id=123 HTTP/1.1" 200
192.168.1.10 - - [21-Apr-2025 15:32:01] "POST /submit.php HTTP/1.1" 404
ကြှနျုပျတို့ ... မြျှောလငျ့ပါတယျ:
IP address ကိုပုံမှန် (ဦး ဆောင်သောသုညများကိုဖယ်ရှားခြင်း);
အချိန်ကို Yyy-MM-DD HH: MM: Ss format ဖြင့်ပေါင်းစည်းခြင်း,
optional ကို: ဥပမာ - လမ်းကြောင်းအတွက် parameters တွေကို parameters တွေကိုကြည့်ပါ။ ဥပမာ /index.php?id=123 → /index.php
<?php
$log = <<<LOG
127.000.000.001 - - [21/Apr/2025:15:32:01 +0000] "GET /index.php?id=123 HTTP/1.1" 200
192.168.1.10 - - [21-Apr-2025 15:32:01] "POST /submit.php HTTP/1.1" 404
LOG;
// ပုံမှန်နှင့်သက်ဆိုင်ရာအပြောင်းအလဲနဲ့ callbacks သတ်မှတ်
$patterns = [
// IP လိပ်စာပုံစံ:ဦး ဆောင် Zeros ဖယ်ရှားပါ
'/\b(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\b/' => function ($matches) {
return implode('.', array_map('intval', array_slice($matches, 1, 4)));
},
// Apache Timestamp [21/Apr/2025:15:32:01 +0000]
'/\[(\d{2})\/(\w{3})\/(\d{4}):(\d{2}):(\d{2}):(\d{2}) [+\-]\d{4}\]/' => function ($matches) {
$monthMap = [
'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04',
'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08',
'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12'
];
return sprintf('%s-%s-%s %s:%s:%s',
$matches[3], // ခုနှစ်
$monthMap[$matches[2]] ?? '01', // လ
$matches[1], // နေ့
$matches[4], $matches[5], $matches[6]
);
},
// နေ့志格式中另一种时间 [21-Apr-2025 15:32:01]
'/(\d{2})-(\w{3})-(\d{4}) (\d{2}):(\d{2}):(\d{2})/' => function ($matches) {
$monthMap = [
'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04',
'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08',
'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12'
];
return sprintf('%s-%s-%s %s:%s:%s',
$matches[3],
$monthMap[$matches[2]] ?? '01',
$matches[1],
$matches[4], $matches[5], $matches[6]
);
},
// ရေွှ့ URL တေးရေး(ကဲ့သို့ /index.php?id=123 → /index.php)
'#(GET|POST|PUT|DELETE|HEAD) (/[\w\-\/\.]+)(\?[^\s"]*)?#' => function ($matches) {
return $matches[1] . ' ' . $matches[2];
}
];
// လျှောက်လွှာအစားထိုး
$formatted = preg_replace_callback_array($patterns, $log);
// ရလဒ်ရလဒ်
echo nl2br(htmlspecialchars($formatted));
?>
အထက်ပါ script ကိုဖွင့်ပြီးနောက်, မှတ်တမ်းအကြောင်းအရာများကို format လုပ်လိမ့်မည်။
127.0.0.1 - - 2025-04-21 15:32:01 "GET /index.php HTTP/1.1" 200
192.168.1.10 - - 2025-04-21 15:32:01 "POST /submit.php HTTP/1.1" 404
Preg_replace_callback_array ဖြင့်ကျွန်ုပ်တို့သည်ကွက်လပ်ရှိပုံစံအမျိုးမျိုးဖြင့်ပုံစံအမျိုးမျိုးကိုအလွန်လှပသောနည်းဖြင့်ကိုင်တွယ်နိုင်ကြသည်။ ၎င်း၏အားသာချက်မှာ Modes မျိုးစုံကိုတစ်ပြိုင်တည်းကိုင်တွယ်ခြင်းသည်တစ်ပြိုင်နက်တည်းလုပ်ဆောင်သည်။ တစ်ခုချင်းစီတွင်ကိုယ်ပိုင် callback function ကိုလွတ်လပ်စွာပြုလုပ်နိုင်သည်။