如何从这些日志中提取查询字符串?

时间:2016-02-04 19:33:36

标签: php regex

我在日志文件中有一堆行,我只需要提取查询字符串部分。我已经确定了这些模式:

/path/optin.html?e=somebase64string&l=somedifferentbase64string HTTP...
"/path/optin.html?e=somebase64string%3D&l=somedifferentbase64string" "browser info"...
"/path/optin.html?" "browser info"...

一些注意事项:

  • 有时路径和查询字符串用双引号括起来
  • 有时根本没有查询字符串,显然没有查询字符串的字符串将被丢弃。
  • 有时base64字符串是url编码的,因此结尾的“=”部分改为“%3D”。我不认为这会影响我的剧本,但我想我也会注意到它。

所以,我能够正确地提取 - 希望 - 所有跟随上面第一个模式的行,但其他的我遇到了一些麻烦。

这是我正在尝试的模式:

$pattern = '/html\?(.*)\s*HTTP/';

然后我在日志行上运行 preg_match

任何人都可以用更好的正则表达式来帮助我吗?

我需要从日志行中抓取这部分:

E =&somebase64string放大器; L = somedifferentbase64string

由于

1 个答案:

答案 0 :(得分:2)

您可以使用~\?([^\s.]*)~之类的模式匹配?之后的所有内容,直到您到达空白字符(假设规则为"网址中永远不会有空格[不是&# 39; t %20]):

$pattern = '~\?([^\s.]*)~';
preg_match_all($pattern, $logs, $output);

然后修剪任何引号(例如在上一个示例中):

$output = array_map(function($var) { return rtrim($var, '"'); }, $output[1]);

给你:

Array
(
    [0] => e=somebase64string&l=somedifferentbase64string
    [1] => e=somebase64string%3D&l=somedifferentbase64string
    [2] => 
)

Example