我正在逐行解析日志文件。
我希望匹配以下内容:
"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 :(得分:4)
此正则表达式将匹配所有四种变体:
^"GET /manager/? HTTP/1\.1" (200|401)$
除非使用其他字符作为分隔符,否则您还必须使用反斜杠转义斜杠。
答案 1 :(得分: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]);
答案 2 :(得分: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);