0

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:"上海"

4

1 に答える 1

0

このテスト データで正規表現を実行すると、完全に正常に動作します。

$record = '[command] search [params] customer: Pudong Shangri-La, Shanghai keywords: bar rough, nearby poi: 18270, record_limit: 20, page: 1, language: cn, ip_address: ..*.* [headers] 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:"China";s:12:"GEOIP_REGION";s:2:"23";s:17:"GEOIP_REGION_NAME";s:8:"Shanghai";s:10:"GEOIP_CITY";s:8:"Shanghai"';
preg_match("/\[params\] (.*?) \[/i", $record, $regs);
echo $regs[1];

それが示している

顧客: 浦東シャングリラ、上海 キーワード: バー ラフ、近くの poi: 18270、record_limit: 20、page: 1、language: cn、ip_address: .. .

コンマとコロンを含めて from [params]untilと完全に一致します。[headers]

顧客名のみを抽出する場合は、例の文字列に基づいてこれを試してください

$record = '[command] search [params] customer: Pudong Shangri-La, Shanghai keywords: bar rough, nearby poi: 18270, record_limit: 20, page: 1, language: cn, ip_address: ..*.* [headers] 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:"China";s:12:"GEOIP_REGION";s:2:"23";s:17:"GEOIP_REGION_NAME";s:8:"Shanghai";s:10:"GEOIP_CITY";s:8:"Shanghai"';
preg_match("/\[params\]\s*customer:\s*(.*?)\s+keywords:/i", $record, $regs);
echo $regs[1];
于 2012-12-13T08:49:30.450 に答える