2

我正在逐行解析日志文件。

我想匹配以下内容:

"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)) 
    {
    }

如果有更好的方法?谢谢

4

3 回答 3

4

此正则表达式将匹配所有四种变体:

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

除非您使用另一个字符作为分隔符,否则您还必须使用反斜杠转义斜杠。

于 2013-02-22T10:16:50.980 回答
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]);
于 2013-02-22T10:35:51.513 回答
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);
于 2013-02-22T10:37:23.617 回答