1

使用 PHP,是否有更好的方法可以在不使用 strpos 和 substr PHP 函数的情况下从文本文件中提取适当的信息位?

我需要提取“Course xxx”、No 和 Ref

示例:主题为“课程 1....”的记录结果将是:

  • 课程 1
  • 8415
  • 152

示例 .txt 文件:

Name: Dave
Age: 15
Subject: Course 1 (No: 8415, Ref: #152#)
Description:

Description 1



Name: John
Age: 28
Subject: Course 2 (No: 646544, Ref: #325#)
Description:

Description 1



Name: Steve
Age: 22
Subject: Course 3 (No: 545, Ref: #451#)
Description:

Description 1

编辑:注意到我不需要提取所有数据,但所有数据仍将在文件中。

4

4 回答 4

3
if(preg_match_all('~'.
    'Name:\\s*(?<Name>.+?)\r?\n'. // Name
    'Age:\\s*(?<Age>[0-9]+)\r?\n'. // Age
    'Subject:\\s*(?<Subject>.+?)\\s*\\('. // Subject
        'No:\\s*(?<No>[0-9]+)\\s*,'. // No
        '\\s*Ref:\\s*#(?<Ref>[0-9]+)#'. // Ref
    '\\)\r?\n'. // /Subject
    'Description:\\s*(?<Description>.+?)\r?\n'. // Description
'~si', $AccountDump, $Matches)){
    $Names = $Matches['Name'];
    $Ages = $Matches['Age'];
    $Subjects = $Matches['Subject'];
    $Nos = $Matches['No'];
    $Refs = $Matches['Ref'];
    $Descriptions = $Matches['Description'];
    $Accounts = array();
    foreach($Names as $Key => $Name){
        $Accounts[$Key] = array_map('trim', array(
            'Name'              => $Name,
            'Age'               => $Ages[$Key],
            'Subject'           => $Subjects[$Key],
            'No'                => $Nos[$Key],
            'Ref'               => $Refs[$Key],
            'Description'       => $Descriptions[$Key],
        ));
    }
    // Got them!
    var_dump($Accounts);
}

在名为$AccountDump的变量中加载文本。

玩得开心。在您的样品上进行了测试,它可以工作。我已经拆分了 RegExp,因此您可以根据需要对其进行跟踪。

希望它有效!

于 2012-10-17T21:05:14.610 回答
1

您可能需要为此使用正则表达式。它会变得有点复杂,但不会像strposand那样糟糕substr

作为起点,这是一个匹配名称:值对的正则表达式 -

$matches = array();
preg_match_all('/^([^\s:]+):\s*(.+)$/m', $data, $matches);

print_r($matches);

编辑:我很好奇并完成了正则表达式,这里是完整的 -

preg_match_all('/^([^\s:]+):\s*(.+?)(?:\s*\(([^\s:]+):\s*(.+),\s*([^\s:]+):\s*(.+)\))?$/m', $data, $matches);
于 2012-10-17T20:46:58.767 回答
1

你可以有

$data = file_get_contents("log.txt");
$data = array_chunk(array_filter(array_map("trim",explode(chr(13).chr(10).chr(13), $data))),2);
$lists = array();

foreach ( $data as $value ) {
    $list = array();
    foreach ( explode("\n", implode("", $value)) as $item ) {
        list($key, $value) = explode(":", $item);
        $list[trim($key)] = trim($value);
    }
    $lists[] = $list;
}
var_dump($lists);

输出

array
  0 => 
    array
      'Name' => string 'Dave' (length=4)
      'Age' => string '15' (length=2)
      'Subject' => string 'Course 1 (No' (length=12)
      'Description' => string 'Description 1' (length=13)
  1 => 
    array
      'Name' => string 'John' (length=4)
      'Age' => string '28' (length=2)
      'Subject' => string 'Course 2 (No' (length=12)
      'Description' => string 'Description 1' (length=13)
  2 => 
    array
      'Name' => string 'Steve' (length=5)
      'Age' => string '22' (length=2)
      'Subject' => string 'Course 3 (No' (length=12)
      'Description' => string 'Description 1' (length=13)
于 2012-10-17T22:02:09.593 回答
0

看看这两个 PHP 函数:

preg_replace

preg_match_all

于 2012-10-17T20:35:56.547 回答