2013-02-22 15 views
2

我正在逐行解析日誌文件。PHP正則表達式匹配多個條目?

我想匹配以下幾點:

"GET /manager/ HTTP/1.1" 200 
"GET /manager HTTP/1.1" 200 
"GET /manager HTTP/1.1" 401 
"GET /manager/ HTTP/1.1" 401 

目前我指定每個選項,以它自己的變量,然後做:

if (strpos($line,$a) || strpos($line,$b) || strpos($line,$c) || strpos($line,$d)) 
    { 
    } 

,如果有更好的辦法? 感謝

+0

你想怎樣搭配?您的問題不清楚 – 2013-02-22 10:16:14

回答

4

這個正則表達式匹配所有四個變化:

^"GET /manager/? HTTP/1\.1" (200|401)$ 

您還將有除非您使用其它字符作爲分隔符用反斜槓逃脫斜線。

+0

謝謝。這是我嘗試過的,但它沒有返回結果: 'if(preg_match('^「GET \/manager \ /?HTTP \/1 \ .1」(200 | 401)$ ^',$ line) )' – MacMan 2013-02-22 10:29:32

+0

語法錯誤。使用'/ ^'...'$ /',或者'〜^'...'$〜'並且不要使用斜槓。 – Jon 2013-02-22 10:32:37

+0

對不起,沒有這個:'if(preg_match('〜^「GET/manager /?HTTP/1 \ .1」(200 | 401)$〜',$ line))' – MacMan 2013-02-22 10:46:32

0

試試吧

$str = ' 
"GET /manager/ HTTP/1.1" 200 
"GET /manager HTTP/1.1" 200 
"GET /manager HTTP/1.1" 401 
"GET /manager/ HTTP/1.1" 401 
'; 

preg_match_all('#^\s*("GET\s+/manager/?\s+HTTP/1\.1"\s+(?:200|401)+)#im', $str, $match); 
print_r($match[1]); 
0

試試這個正則表達式(GET|POST)\s+(.*)\s+(HTTP.*)\s+(\d{3})這會給你["GET", "/manager/", "HTTP/1.1", "401"]

更新代碼:

$logStr = '"GET /manager/ HTTP/1.1" 200 
"GET /manager HTTP/1.1" 200 
"GET /manager HTTP/1.1" 401 
"GET /manager/ HTTP/1.1" 401 
'; 
echo $logStr; 
preg_match('/(GET|POST)\s+(.*)\s+(HTTP.*)\s+(\d{3})/', $logStr, $matches); 
print_r($matches); 
+0

你的代碼找不到@ user1635970需要什麼。 – Winston 2013-02-22 10:42:48