继续Getting the file name from a text file after string matching - PHP 我有一个log.txt文件,格式为:
================================================
Header of entry with date and time
================================================
Loaded options from XML file: '/path/to/the/file/some_file.xml
extendedPrintPDF started
Postfix '4.4' was append from file 'some-other_file.xml' for file: /path/to/the/file/some-other_file.indd
printPDF started
PDF Export Preset: Some preset
PDF file created: '/path/to/the/file/some_filey_namex_lo_4.4.pdf'.
File filename_lo-metadata.xml removed
postprocessingDocument started
INDD file removed: /path/to/the/file/some_file1_name_lo.indd
Error opening document: /path/to/the/file/some_file_name_lo.indd: Error: Either the file does not exist, you do not have permission, or the file may be in use by another application; line: 190
================================================
Header of entry with date and time
================================================
Loaded options from XML file: '/path/to/she/file/some_options.xml
extendedPrintPDF started
extendedPrintPDF: Error: Unsaved documents have no full name.; line: 332
我想在日志条目中捕获“错误”(如果存在),然后检测错误消息(如“未保存的文档没有全名”)或只是“打开文档时出错”并获取名称所有,只有正在创建的pdf文件。
我是新手,并不知道该如何做到这一点。
我想我已经提供了完整的信息,我在之前的帖子中没有这样做。
CHANGE: 我还想从/path/to/the/file/filename.something中获取'the'。 我不是在寻找一个确切的答案(即使它会很棒)。但是,一些帮助或指导将不胜感激。
注意: 有没有办法在没有使用RegEx的情况下这样做(我是新手,而且,我对RegEx一点也不擅长) 感谢
答案 0 :(得分:1)
<强>正则表达式强>
如何获取文件名:
#(/.*/\w+\.\w{3})#
如何获取错误:
/Error: (.*)/m
<强> PHP 强>
<?php
$file_data = __your__file__data__;
preg_match_all("#(/.*/\w+\.\w{3})#", $file_data, $filenames);
var_dump($filenames);
preg_match_all("/Error: (.*)/m", $file_data, $errors);
var_dump($errors);
?>
示例输出
array (size=2)
0 =>
array (size=3)
0 => string '/the/path/of/log_options.xml' (length=28)
1 => string '/path/of/some/filesomething.ind' (length=31)
2 => string '/the/path/of/log_options.xml' (length=28)
1 =>
array (size=3)
0 => string '/the/path/of/log_options.xml' (length=28)
1 => string '/path/of/some/filesomething.ind' (length=31)
2 => string '/the/path/of/log_options.xml' (length=28)
array (size=2)
0 =>
array (size=2)
0 => string 'Error: file doesnt exist or no permissions
' (length=44)
1 => string 'Error: Unsaved documents have no full name: line xyz' (length=52)
1 =>
array (size=2)
0 => string 'file doesnt exist or no permissions
' (length=37)
1 => string 'Unsaved documents have no full name: line xyz' (length=45)
我会让你弄清楚如何使用这些信息并将其放入你的数据库。
答案 1 :(得分:0)
这实际上只匹配您提供给我们的有限日志片段的语法,但它应该是一个开始。它逐行遍历日志文件,并尽力跟踪它所在的日期部分。
<?php
$logfile = '/path/to/the/file.log';
$fh = fopen($logfile, 'r') or die("can't open file.");
$r_delim = '/^=*$/'; // matches lines of only =
$r_time = '/^\[(.*)\] - .*$/'; // matches lines that start with [, captures contents between [ and ]
$r_error = '/ Error: /'; // matches lines that contain the string ' Error: '
$skip_delim = FALSE;
$last_timestamp = 'no stamp';
$matches = array();
while($line = fgets($fh)) {
if( preg_match($r_delim, $line) && ! $skip_delim) {
$line = fgets($fh);
preg_match($r_time, $line, $matches);
$last_timestamp = $matches[1];
$skip_delim = TRUE;
} else if( preg_match($r_delim, $line) && $skip_delim ) {
$skip_delim = FALSE;
} else if( preg_match($r_error, $line) ) {
printf('%s :: %s', $last_timestamp, $line);
}
}
输出:
Jan 25 2012 11:26:03 :: Error opening document: /the/path/to/file/some_file_name_lo.indd: Error: Either the file does not exist, you do not have permission, or the file may be in use by another application; line: 190
Feb 24 2012 15:57:43 :: extendedPrintPDF: Error: Unsaved documents have no full name.; line: 332
Feb 24 2012 15:57:43 :: extendedPrintPDF: Error: Unsaved documents have no full name.; line: 332