从一行中提取内容

时间:2013-11-21 22:04:44

标签: php regex preg-match phrase

我正在试着说出我的访问日志文件,为此我只是逐行读取访问日志文件并从每行中提取有用信息,最后将它们添加到数据库中。

例如,一条线看起来像这样。

124.99.152.202 - naveen [22/Nov/2013:10:41:17 +1300] "GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078/IneedThisInteger/12.txt HTTP/1.1" "200" "3" "-" "Mozilla/5.0" "-"

我只知道如何提取IP地址。(使用this

我想提取

  1. 此请求值 - GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/12.txt HTTP/1.1

  2. 来自上述部分的整数值 - IneedThisInteger

  3. 此状态部分 - 200

  4. 此字节部分 - 3

  5. 有时请求网址更改最后一部分

    "GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/FOLDER/12.txt HTTP/1.1"
    "GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/FOLDER/ANOTHER FOLDER/12.txt HTTP/1.1"
    "GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/FOLDER/ANOTHER FOLDER/HEREIS-ANOTHER-FOLDER-AND-SO-ON/12.txt HTTP/1.1"
    

    所以我真的需要一种稳定的方法来从每一行获取这些值。我该怎么做?

2 个答案:

答案 0 :(得分:1)

假设你总是有GET请求,这应该可以解决问题

"(GET /.*?/.*?,\d+,(\d+)/.*?)"\s"(\d+)"\s"(\d+)"

有关表达的解释,请参阅regex101.com

答案 1 :(得分:1)

这应该可以解决问题:

^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?"(.*?/p/.*?,\d+,(\d+).*?)" "(\d+)" "(\d+)".*$

这是一个演示的小提琴:http://www.rexfiddle.net/3sDwWut

为了测试目的,我用实际数字替换了“我需要这个整数”,并且还将“字节”和IP地址随机化了一点。这些是捕获,按顺序:

  1. 知识产权
  2. 请求(例如GET xxx HTTP/1.1
  3. 您想要的网址中的整数
  4. HTTP状态
  5. 字节数