PHP正则表达式匹配多个条目?

时间:2013-02-22 10:15:17

标签: php regex file

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

我希望匹配以下内容:

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

如果有更好的方法吗? 感谢

3 个答案:

答案 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);