Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
还有一个使用PHP的apache日志文件正则表达式_Php_Regex_Apache - Fatal编程技术网

还有一个使用PHP的apache日志文件正则表达式

还有一个使用PHP的apache日志文件正则表达式,php,regex,apache,Php,Regex,Apache,我已经读了十几个不同的答案,但都不符合我的要求 我不知道如何编写正则表达式(我无能为力),我需要一些帮助 我正在尝试解析一个Apache日志文件(设置为默认值,因为我没有对它进行任何更改-使用xampp) 我尝试了以下模式,但都漏掉了一些要点: $pat='/(\d+\.\d+\.\d+\.\d+) ([^\s]+) ([^\s]+) \[(\d+)\/(\w+)\/(\d+):(\d{1,2}:\d{1,2}:\d{1,2} ?[\+\-]?\d*)\] "(.*) (HTTP\/\d

我已经读了十几个不同的答案,但都不符合我的要求

我不知道如何编写正则表达式(我无能为力),我需要一些帮助

我正在尝试解析一个Apache日志文件(设置为默认值,因为我没有对它进行任何更改-使用xampp)

我尝试了以下模式,但都漏掉了一些要点:

    $pat='/(\d+\.\d+\.\d+\.\d+) ([^\s]+) ([^\s]+) \[(\d+)\/(\w+)\/(\d+):(\d{1,2}:\d{1,2}:\d{1,2} ?[\+\-]?\d*)\] "(.*) (HTTP\/\d\.\d)" (\d+) (\d+) "([^"]*)" "([^"]*)"/';
    $pat="/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] [\w.]+ \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")$/";
    $pat='/^(\S+) \S+ \S+ \[([^\]]+)\] "([A-Z]+)[^"]*" \d+ \d+ "[^"]*" "([^"]*)"$/m';
    $pat='/^(\S+) \S+ \S+ \[(.*?)\] "(\S+).*?" \d+ \d+ "(.*?)" "(.*?)"/';
    $pat='/^(\S+)\s \S+\s+ (?:\S+\s+)+ \[([^]]+)\]\s "(\S*)\s? (?:((?:[^"]*(?:\\")?)*)\s ([^"]*)"\s| ((?:[^"]*(?:\\")?)*)"\s) (\S+)\s (\S+)\s "((?:[^"]*(?:\\")?)*)"\s "(.*)"$/';

    preg_match($pat, $b, $m);
第一个是迄今为止最好的(1000条记录中有113条未命中)

下面是一个缺少的行的示例:

10.21.142.253 - - [25/Oct/2014:07:42:36 -0200] "GET / HTTP/1.1" 302 - "-" "Mozilla/5.0 (Windows NT 6.1; rv:33.0) Gecko/20100101 Firefox/33.0" 
它在这样的线路上工作:

127.0.0.1 - - [25/Oct/2014:08:49:51 -0200] "GET /xampp/ HTTP/1.1" 401 1392 "-" "Mozilla/5.0 (Windows NT 6.1; rv:33.0) Gecko/20100101 Firefox/33.0" 

文件大小似乎有问题。

区别在于您可以添加一个连字符
-
,作为替代
(\d+|-)

我还将文字空格“转换”为
\s+
。如果您对该更改不满意,只需使用您原来的更改:

(\d+\.\d+\.\d+\.\d+) ([^\s]+) ([^\s]+) \[(\d+)\/(\w+)\/(\d+):(\d{1,2}:\d{1,2}:\d{1,2} ?[\+\-]?\d*)\] "(.*) (HTTP\/\d\.\d)" (\d+) (\d+|-) "([^"]*)" "([^"]*)

请参见和

您希望获得哪一行?它工作正常<代码>$pat='/(\d+(?:\.\d+){3})s+(\s+)\s+(\s+)\s+\[(\d+)/(\w+)/(\d+):(\d{1,2}:\d{1,2}:\d{1,2}\s?[+-]?\d*)\](.*s+(HTTP\/\d\.\d+)\s+)\s+(\d+)\s*(\d+)\s*(\d+)\s*(\d+)(\d+)\s*(\d+)\s*)(\d+)*)\s+)(\s+)*(\s+)*)/“(\s+)*”(\s+)导致100.000次读取,0次失败。谢谢,太好了。我认为
\s
对于需要调试或更新的较长正则表达式非常有用。此外,使用
\s
(非空白)也比使用
\s
更安全。
(\d+\.\d+\.\d+\.\d+) ([^\s]+) ([^\s]+) \[(\d+)\/(\w+)\/(\d+):(\d{1,2}:\d{1,2}:\d{1,2} ?[\+\-]?\d*)\] "(.*) (HTTP\/\d\.\d)" (\d+) (\d+|-) "([^"]*)" "([^"]*)