0

继续在字符串匹配后从文本文件中获取文件名 - 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 文件。

我是一个新手,真的不知道我应该如何去做。

我想我已经提供了完整的信息,而我在之前的帖子中没有做到这一点。

更改:我还想从 /path/to/the/file/filename.something 中获取“the”。我不是在寻找一个确切的答案(即使它会很棒)。但是,我们将不胜感激一些帮助或指导。

注意:有没有办法在不使用 RegEx 的情况下做到这一点(我是新手,而且我一点也不擅长 RegEx)谢谢

4

2 回答 2

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)

我会让您弄清楚如何使用这些信息并将其放入您的数据库中。

于 2012-12-21T19:18:31.037 回答
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
于 2012-12-21T19:33:49.653 回答