txtファイルからWebアプリケーションのログを抽出するスクリプトがあります。最近データベースにコンマ付きの値が入力されるまで、ログの抽出に問題はありませんでした。私は現在、文字列のパターンを照合するためにpreg_matchを使用していますが、その1つは次のとおりです。
preg_match("/\[params\] (.*?) \[/i", $record, $regs);
上記は、次のようなログテキストファイルのコンテンツを照合するために使用されます。[params]顧客:Shangrila Shanghai Pudong、poi_id:14747、言語:en ...(照合に問題はありません。最近、このようなエントリが作成されました。文字列にコンマが含まれる方法例:
[params] customer: Shangrila Shanghai, Pudong poi_id: 14747, language: en
カンマがあるため、preg_matchは「ShangrilaShanghai」までしか一致しないと思います。この結果、その特定の顧客のログを抽出できません。将来このような問題を回避するために、データベースのエントリをすでに変更しましたが、前の月のログを抽出する必要があります。
私は正規表現の初心者であり、これを修正するために頭を悩ませてきました。「ShangrilaShanghai」だけでなく、「Shangrila Shanghai、Pudong」のパターン全体に一致するように何を変更できますか?
私は明確であり、どんな助けも非常に高く評価されていることを願っています。前もって感謝します。コードのブロックは次のとおりです。
foreach ($files as $filename)
{
$path = "$root/../request_archive/$filename";
$extracted = "$root/../request_archive/$filename.temp";
$fh = fopen($extracted, "r");
$count = 0;
while (!feof($fh))
{
$line = fgets($fh);
if (preg_match("/^\[id\]/", $line))
{
$count = 0;
$record = $line;
} else {
$count++;
$record .= $line;
if ($count > 1)
{
// echo "count: $count\n";
// echo "\n\n$record\n\n";
}
if (!isset($regs[1]) || $customer_name != $regs[1])
{
preg_match("/client: (.*?),/i", $record, $regs);
if (!isset($regs[1]) || $customer_name != $regs[1])
{
continue;
}
}
preg_match("/\[command\] (.*?) \[/i", $record, $regs);
$log_command = $regs[1];
preg_match("/\[params\] (.*?) \[/i", $record, $regs);
$content = $regs[1];
preg_match("/\[request_time\] (.*?) \[i", $record, $regs);
[コマンド]検索[パラメータ]顧客:浦東シャングリラ、キーワード:バーラフ、近くのポイ:18270、record_limit:20、ページ:1、言語:cn、ip_address :。。*。*[ヘッダー]a:44:{s:10: "GEOIP_ADDR"; s:13: ""; s:20: "GEOIP_CONTINENT_CODE"; s:2: "AS"; s:18: "GEOIP_COUNTRY_CODE" ; s:2: "CN"; s:18: "GEOIP_COUNTRY_NAME"; s:5:"中国"; s:12: "GEOIP_REGION"; s:2: "23"; s:17: "GEOIP_REGION_NAME"; s :8:"上海";s:10: "GEOIP_CITY"; s:8:"上海"