質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

763閲覧

PHP: apacheのcombined形式における、正規表現のパターン構文の書き方について

退会済みユーザー

退会済みユーザー

総合スコア0

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2020/06/14 08:15

編集2020/06/14 08:24

PHPでログ解析のプログラムを作成しています。
以下のようなプログラムを作成しました。

<?php $handle = fopen("access_log", "r"); $result = []; $pattern = '/^(\S+)\s(\S+)\s(\S+)\s[([\S|\s]+)]\s"([\S|\s]+)"\s(\d+)\s(\d+)\s"\s|(\S+)"\s"([\S|\s]+)"/'; if ($handle) { while ($buffer = fgets($handle)) { preg_match($pattern, $buffer, $elements); $line = ['host'=>$elements[1], 'client'=>$elements[2], 'user'=>$elements[3], 'time'=>$elements[4], 'request'=>$elements[5], 'response_status'=>$elements[6], 'byte'=>$elements[7], 'referer'=>$elements[8], 'agent'=>$elements[9] ]; array_push($result, $line); } } fclose($handle); var_export($result);

combine形式のログを解析して、$patternに代入したいのですが、

'request'=>$elements[5]
'byte'=>$elements[7]
'agent'=>$elements[9]

のelement[]の値が、'-'の場合でも表示できるようにしたいです。

また、

'referer'=>$elements[8]

の値が空白でない場合も表示したいのです。

おそらく、

$pattern = '/^(\S+)\s(\S+)\s(\S+)\s[([\S|\s]+)]\s"([\S|\s]+)"\s(\d+)\s(\d+)\s"\s|(\S+)"\s"([\S|\s]+)"/';

の中の
'request'=>$elements[5]
'byte'=>$elements[7]
'referer'=>$elements[8]
'agent'=>$elements[9]

に該当する箇所に

\S|\s

のように記述して、「空白文字以外、もしくは空白文字にマッチ」という内容に書き換えるのだと思うのですが、上手くいきません。

$patternのどこに \S|\s といった表示を記述すべきなのかアドバイス頂けたらと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

すいません解決しました。
$patternを以下のように書き換えたら解決しました。

$pattern = '/^([^ ]*) ([^ ]*) ([^ ]*) [([^]]*)] "(.*?)" ([^ ]*) ([^ ]*) "(.*?)" "(.*?)"/';

投稿2020/06/14 09:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問