1

PHPを使用して、strposおよびsubstr PHP関数を使用せずに、テキストファイルから適切な情報を抽出するためのより良い方法はありますか?

「Coursexxx」、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

あなたが持つことができます

$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 に答える
1

これにはおそらく正規表現を使用したいと思うでしょう。strpos少し複雑になりますが、 andほど悪くはありません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 に答える
0

次の 2 つの PHP 関数を見てください。

preg_replace

preg_match_all

于 2012-10-17T20:35:56.547 に答える