【问题标题】:Extract contents from a line从一行中提取内容
【发布时间】:2013-11-21 22:04:43
【问题描述】:

我正在尝试对我的访问日志文件进行表述,为此我只需逐行读取访问日志文件并从每一行中提取有用的信息,最后将它们添加到数据库中。

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

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

有时请求 URL 会更改它的 最后一部分

"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"

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

【问题讨论】:

  • 您通过选择适当的标签回答了您的问题:使用正则表达式
  • @kingkero 问题是如何使用正则表达式来做到这一点,我尝试使用上面提到的在线工具但失败了。

标签: php regex preg-match phrase


【解决方案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. IP
  2. 请求(例如GET xxx HTTP/1.1
  3. 您想要的 URL 中的整数
  4. HTTP 状态
  5. 字节数

【讨论】:

  • 这很好,但我不知道你是怎么做到的。感谢 SpikeX
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 2011-05-25
    • 2017-06-14
    • 2012-01-28
    • 2018-06-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多