помощь при разборе строк - PullRequest
0 голосов
/ 25 мая 2010

У меня есть такая строка:

####################
Section One
####################
Data A
Data B


####################
   Section Two
####################
Data C
Data D

etc.

Я хочу разобрать что-то вроде:

$arr(
    'Section One' => array('Data A', 'Data B'),
    'Section Two' => array('Data C', 'Data D')
)

Сначала я попробовал это:

$sections = preg_split("/(\r?\n)(\r?\n)#/", $file_content);

Проблема в том, что файл не идеально чистый: иногда между разделами имеется разное количество пустых строк или пробелов между строками данных.

Кажется, что сама структура заголовка секции относительно непротиворечива:

####################
   Section Title
####################

Число #, вероятно, соответствует, но я не хочу на это рассчитывать. Пробел в строке заголовка довольно случайный.

Как только я разделю его на разделы, я думаю, что это будет довольно просто, но любая помощь в написании очередного убийцы поможет получить его там. (Или если есть лучший подход, чем reg ex ...)

Ответы [ 2 ]

3 голосов
/ 25 мая 2010

Я бы выбрал многошаговый подход:

  • разделить на заголовки разделов / содержание
  • разобрать каждую пару заголовок / содержимое в желаемую структуру массива

Вот пример, разбитый на несколько строк, чтобы вы могли отслеживать происходящее:

Обратите внимание на отсутствие проверки работоспособности, это предполагает хорошие, аккуратные заголовки / группы содержимого.
Регулярное выражение было написано для краткости и может или не может быть достаточно для ваших нужд.

// Split string on a line of text wrapped in lines of only #'s
$parts = preg_split('/^#+$\R(.+)\R^#+$/m', $subject, null, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
// Tidy up leading/trailing whitespace for each heading/content-block
$parts = array_map('trim', $parts);
// Chunk into array("heading", "content")
$parts = array_chunk($parts, 2);

// Create the final array
$sections = array();
foreach ($parts as $part) {
    $sections[$part[0]] = explode("\n", $part[1]);
}

// Lets take a look
var_dump($sections);
1 голос
/ 25 мая 2010

Я смог быстро написать это:

<?php
$text = <<<EOT
####################
Section One
####################
Data B.Thing=bar#
.##.#%#

####################
   Empty Section!
####################
####################
   Last section
####################

Blah

   Blah C# C# C#

EOT;
$entries = array_chunk(
   preg_split("/^#+/m", $text, null, PREG_SPLIT_NO_EMPTY),
   2
);
$sections = array();
foreach ($entries as $entry) {
  $key = trim($entry[0]);
  $value = preg_split("/\n/", $entry[1], null, PREG_SPLIT_NO_EMPTY);
  $sections[$key] = $value;
} 
print_r($sections);
?>

Вывод: ( как запущено на ideone.com )

Array
(
    [Section One] => Array
        (
            [0] => Data B.Thing=bar#
            [1] => .##.#%#
        )

    [Empty Section!] => Array
        (
        )

    [Last section] => Array
        (
            [0] => Blah
            [1] =>    Blah C# C# C#
        )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...