電子書籍の厳選無料作品が豊富!

POST /xxxxxx/xxxxxx/xxxxxx/ HTTP/1.1
GET /xxxxxx/xxxxxx/444444444444444 HTTP/1.1
GET /xxxxxx/xxxxxx/44444444444444/ HTTP/1.1
GET /xxxxxx/ HTTP/1.0
GET /xxxxxx/P707 HTTP/1.1
GET /xxxxxx/P707_0123 HTTP/1.1

GET /xxxxxx/xxxxxx/?xxxxxx=444444444444444&xxxxxx= HTTP/1.1
GET /xxxxxx/xxxxxx/xxxxxx/444444444444444/?xxxxxx=123456789 HTTP/1.1
GET /xxxxxx/xxxxxx/444444444444444/?xxxxxx=ABC_123_3&xxxxxx=ABC_123_3&xxxxxx=123456789 HTTP/1.1

これらは、とあるサーバーのログなのですが、
上記の内容を、正規表現によって以下のように置換を行っています。

POST /xxxxxx/xxxxxx/xxxxxx/ HTTP/1.1
GET /xxxxxx/xxxxxx/ HTTP/1.1
GET /xxxxxx/xxxxxx/ HTTP/1.1
GET /xxxxxx/ HTTP/1.0
GET /xxxxxx/ HTTP/1.1
GET /xxxxxx/ HTTP/1.1

GET /xxxxxx/xxxxxx/ HTTP/1.1
GET /xxxxxx/xxxxxx/xxxxxx/ HTTP/1.1
GET /xxxxxx/xxxxxx/ HTTP/1.1

これらの内容を秀丸(jre32互換)で行っていたのですが、
PHP(perl互換)で実装をしょうと、正規表現を用いて、行ってみたところエラーが出てしまいました。

検索
([GET|POST]) /([a-zA-Z]+[0-9]?/)?([a-zA-Z]+[0-9]?/)?([a-zA-Z]+[0-9]?/)?([a-zA-Z]+[0-9]?/)?[^\s]*\s

置換
\1 /\2\3\4\5
(\5のあとに半角スペースあり)

ひとくちに正規表現といっても、jre32互換かperl互換かで挙動が違うのだと思いますが、
どこをどのように直したら良いのか、よくわかりませんので
教えて頂けないでしょうか?(この正規表現でなくても同じ結果が得られるなら、それでも良いので・・・)

また今回、2回正規表現をしても良いので

POST /xxxxxx/xxxxxx/xxxxxx/ HTTP/1.1
GET /xxxxxx/xxxxxx/ HTTP/1.1

/xxxxxx/xxxxxx/xxxxxx/
/xxxxxx/xxxxxx/

といった具合にもしたいのです。(1回でできれば、一番いいのですが・・・・)

A 回答 (1件)

正規表現はそれで良いです。



・プログラムの中で正規表現をどう使うか
・置換後の文字列をどう指定するか

という正規表現以外のPHPの知識不足です。
たとえば、

$line = 読み込んだデータ;
$line = preg_replace('!([GET|POST]) /([a-zA-Z]+[0-9]?/)?([a-zA-Z]+[0-9]?/)?([a-zA-Z]+[0-9]?/)?([a-zA-Z]+[0-9]?/)?[^\s]*\s!','$1 /$2$3$4$5 ',$line);

こんな風にプログラムを書きます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!