Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.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错误日志问题– ;错误消息中的换行符(\n)_Php_Regex - Fatal编程技术网

解析PHP错误日志问题– ;错误消息中的换行符(\n)

解析PHP错误日志问题– ;错误消息中的换行符(\n),php,regex,Php,Regex,我正在尝试解析PHP错误日志。问题是用\n破坏文件是不起作用的 explode(PHP_EOL, $log) 这不起作用,因为有些错误消息本身包含\n 那么如何将这样的文件按行分解呢 问题日志的摘录: [04-Jan-2012 21:28:48] PHP Notice: Use of undefined constant AY_FACEBOOK_TAB_URL - assumed 'AY_FACEBOOK_TAB_URL' in /var/www/[hidden]/default.layou

我正在尝试解析PHP错误日志。问题是用
\n
破坏文件是不起作用的

explode(PHP_EOL, $log)
这不起作用,因为有些错误消息本身包含
\n

那么如何将这样的文件按行分解呢

问题日志的摘录:

[04-Jan-2012 21:28:48] PHP Notice:  Use of undefined constant AY_FACEBOOK_TAB_URL - assumed 'AY_FACEBOOK_TAB_URL' in /var/www/[hidden]/default.layout.tpl.php on line 36
[04-Jan-2012 22:38:02] PHP Notice:  Use of undefined constant AY_FACEBOOK_TAB_URL - assumed 'AY_FACEBOOK_TAB_URL' in /var/www/[hidden]/default.layout.tpl.php on line 36
[04-Jan-2012 23:43:33] PHP Warning:  file_get_contents(https://graph.facebook.com/4294967295/picture?type=large): failed to open stream: HTTP request failed! HTTP/1.0 500 Internal Server Error
 in /var/www/[hidden]/result.tpl.php on line 11
[04-Jan-2012 23:43:33] PHP Notice:  Undefined variable: image in /var/www/[hidden]/result.tpl.php on line 20

请注意HTTP/1.0 500内部服务器错误后的换行符

尝试使用
“\r\n”
并确保它们位于双引号之间。

使用正则表达式匹配行首。它通常是一个日期/时间(时间戳)

此代码适用于我:

<?php
    $content = file_get_contents('/var/log/php-log.log');

    var_dump(preg_split('/\[\d\d-\w{3}-\d{4}\s+\d\d:\d\d:\d\d\]/', $content));

您需要更具体一些。至少具有换行条件。你怎么知道哪一个
LF
结束一行,哪一个正好在中间?展示一个例子。如果你能提供一些日志的例子就好了。(错误消息中是否有换行符。)答案实际上取决于您试图对数据执行的操作。解析PHP日志的原因是什么?为什么不使用SplFileObject逐行读取文件?@mario,很简单
str\u replace(array(“\n”,“\r”)、array(“\nN\u BREAK”,“\rR\u BREAK”)、[…])
告诉我,所有文件都只包含
\n
BREAK.
preg\u split('/\[\d\d-\w{3}-\d{4}\s+\d\d:\d:\d:\d:\d\d\]/',$error\u log,NULL,preg\u split DELIM u-DELIM u-CAPTURE分隔符本身不返回空。你知道为什么吗?因为你需要在分隔符周围加上括号:
preg\u split('/(\[\d\d-\w{3}-\d{4}\s+\d\d:\d\d:\d\d\])/,$error\u log,NULL,preg\u split\u DELIM\u CAPTURE
请看这个:注意:
如果设置了这个标志,**分隔符模式中带括号的**表达式也将被捕获并返回。