2016-02-04 34 views
1

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

/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

感谢

+0

什么是您预期的结果?请在你的问题中加上 –

+0

你是否检查过'parse_url()'?用空格分解,并解析第一个元素。 –

+0

我试图parse_str提取的查询字符串转换为数组和操作这种方式,我没想到parse_url的,所以我将不得不对其进行测试,由于 – andrux

回答

2

您可以使用格式,如:~\?([^\s.]*)~?后匹配的一切,直到你到达一个空白字符(假设规则“的链接不会有空格的[不在%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

+0

这一个可能的工作,我目前正在测试它,谢谢 – andrux

+1

我修改了一下模式以适应我的需要:〜optin.html \?([^ \ s。] *)〜但这是正确的答案,谢谢! – andrux

相关问题