2016-02-04 77 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