dize ayrıştırma yardım

2 Cevap php

Böyle bir dize var:

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


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

etc.

Gibi bir şey haline ayrıştırmak istiyorum:

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

İlk başta ben bu çalıştı:

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

Sorun dosya mükemmel temiz değil,: bazen veri satır arasındaki bölümler, ya da boş alanlar arasındaki boş satır farklı numaraları vardır.

Bölüm başkanı desen kendisi nispeten tutarlı gibi görünüyor:

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

# 'S sayısı muhtemelen tutarlı, ama ben saymak istemiyorum. Başlık satırında boşluk oldukça rastgele.

Ben o bölümlere ayrılmıştır sonra, ben oldukça basit olacak düşünüyorum, ama bunu almak için bir katil belgeli eski yazılı herhangi bir yardım var mutluluk duyacağız. (Ya reg ex daha iyi bir yaklaşım varsa ...)

2 Cevap

Ben hızlı bir şekilde bu kadar yazdı başardı:

<?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);
?>

Çıktısı: (as run on 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#
        )

)

Ben bir çok adım yaklaşım alırdım:

  • bölüm başlıkları / içerik ayrılmıştır
  • istediğiniz dizi yapısına her başlık / içerik çifti ayrıştırmak

İşte bir örnek oluyor ne izleyebilirsiniz böylece satırlara ayrılabilir, bulunuyor:

Note the lack of sanity checking, this assumes güzel, temiz başlık / içerik grupları.
The regex was written for brevity and may or may not be sufficient for your needs.

// 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);