Разобрать текстовый файл с тегами в PHP - PullRequest
2 голосов
/ 13 июля 2011

У меня есть файл .txt, который выглядит примерно так:

Title: Test
Author: zad0xsis
Date: July 13th, 2011
Body: This is a test post and this can continue until the file end

Как я могу заставить PHP распознавать «теги» и преобразовывать содержимое в новую строку?Заранее спасибо!: D

Ответы [ 6 ]

5 голосов
/ 13 июля 2011
$fc = file('some_file.txt'); // read file into array
foreach ($fc as $line) {
    list($tag, $content) = explode(':', $line, 2);
    // do something here
}

Теперь, есть ли несколько несвязанных наборов в каждом файле? Если это так, вам придется искать какой-то маркер, может быть, новую строку и сделать сброс. Надеюсь, вы сможете разобраться в этой части самостоятельно.

Некоторые функции, которые вы можете проверить:

Редактировать: немного расширив пример:

$fc = file('some_file.txt'); // read file into array
foreach ($fc as $index => $line) {
    list($tag, $content) = explode(':', $line, 2);
    // do something here
    if ('body' == strtolower($tag)) {
        $content = join(array_slice($fc, $index + 1, count($fc)));
        break;
    }
}

Дополнительные функции для вас!

  • strtolower
  • join (он же implode)
  • array_slice
  • trim - это не используется в моем решении, но вы можете использовать его, чтобы обрезать символы новой строки от конца строк, как возвращено file(). В качестве альтернативы вы можете использовать флаг FILE_IGNORE_NEW_LINES при вызове file(), и дополнительную информацию об этом можно найти в записи PHP Manual для file() (также связанной выше).
3 голосов
/ 13 июля 2011

Другое решение: демо здесь

<?php

  //$sample = file_get_contents('myfile.txt'); // read from file

  $sample = "Title: Test
Author: zad0xsis
Date: July 13th, 2011
Body: This is a test post and this can continue until the file end";

  $re = '/^(?<tag>\w+):\s?(?<content>.*)$/m';

  $matches = null;
  if (preg_match_all($re, $sample, $matches))
  {
    for ($_ = 0; $_ < count($matches['tag']); $_++)
      printf("TAG: %s\r\nCONTENT: %s\r\n\r\n", $matches['tag'][$_], $matches['content'][$_]);
  }

производит:

TAG: Title
CONTENT: Test

TAG: Author
CONTENT: zad0xsis

TAG: Date
CONTENT: July 13th, 2011

TAG: Body
CONTENT: This is a test post and this can continue until the file end

Думаю, я бы использовал именованные теги только для врачей общей практики. Кроме того, при необходимости вы можете заменить (?<tag>\w+) на что-то более расплывчатое, например (?<tag>.*?), если могут быть пробелы, числа и т. Д.

2 голосов
/ 13 июля 2011
$file = file("file.txt");
foreach($file as $line)
{
    preg_match("|(.*?): (.*?)|", $line, $match);
    $tag = $match[1];
    $content = $match[2];
}
2 голосов
/ 13 июля 2011
<?php
$tagValue = array();
$file = fopen("welcome.txt", "r") or exit("Unable to open file!");

while(!feof($file))
{
  $line = fgets($file);
  $tagDelimiter = strpos ($line ,":");
  $tag = substr($line,0,$tagDelimiter);
  $value = substr($line,$tagDelimiter+1,strlen($line)-$tagDelimiter);
  $tagValue[$tag] = $value;
}
fclose($file);
?>

Вы можете получить доступ к своим данным: $tagValue["Title"]

1 голос
/ 13 июля 2011

вы можете сделать это:

$file = file('file.txt');

foreach($file as $line)
{
    if(preg_match('/(.*) : (.*)/iUs', $line, $match)
    {
         $tag = $match[1];
         $value = $match[2]
    }
}
0 голосов
/ 13 июля 2011

Используйте strpos () и substr () :

function parse($filename)
{
  $lines = file($filename);
  $content = array();
  foreach ($lines as $line)
  {
    $posColon = strpos($line, ":");
    $tag = substr($line, 0, $posColon);
    $body = substr($line, $posColon+1);

    $content[$tag] = trim($body);
  }
  return $content;
}
...