Der Versuch, eine große, mehrzeilige Datei in ein Array zu preg_split

Ich habe eine Datei formatiert als ...

Datei.txt

[sectionone]
...
...
[sectiontwo]
...
...
[sectionthree]
...
...

Das Format ist sehr ähnlich zu (für diejenigen, die vertraut sind) smb.conf und ich hatte gehofft, ein Array "Abschnitt" Strings am Ende davon zu haben. Am Ende versuche ich einen preg_split zu machen, um jeden Textabschnitt zu nehmen und in ein Array wie ...

Array
(
    [0] => [sectionone]
           ...
           ...
    [1] => [sectiontwo]
           ...
           ...
    [2] => [sectionthree]
           ...
           ...
)

Ich weiß, dass ich die Datei Zeile für Zeile lesen und eine Lösung auf diese Weise erstellen könnte, aber ich bin stur wie die Hölle und versuche herauszufinden, wie es meinen Bedürfnissen entspricht. Die Aufteilung muss erfolgen, wenn ein "[" (Klammer) am Anfang einer Zeile steht und alles, was zur nächsten Klammer (Zeilenumbrüche, Tabulatoren, beliebige Zeichen usw.) führt, ein faires Spiel ist. Die meisten Meine Versuche haben entweder zu nichts oder zu einer Array-Zählung von 1 mit ALLES geführt.

 $fileString = file_get_contents( '/tmp/Datei.txt' );
 print_r( preg_split( "/^\[.*\]\n$/", $fileString );

... führt zu unerwünschten ...

Array
(
    [0] => [sectionone]
           ...
           ...
           [sectiontwo]
           ...
           ...
           [sectionthree]
           ...
           ...
}

Jede Hilfe würde sehr geschätzt werden, da meine Regex-Fähigkeiten bestenfalls Anfänger sind. Danke im Voraus.

0
Brauchst du nur die Abschnittsnamen? Oder brauchst du die Werte in jedem Bereich?
hinzugefügt der Autor bagonyi, Quelle

3 Antworten

Sie könnten stattdessen preg_match_all verwenden?

$fileString = '[sectionone]
...
...
[sectiontwo]
...
...
[sectionthree]
...
...';
preg_match_all("/^\[.*?(?=\n\[|\z)/ms", $fileString, $matches);
print_r($matches);

Dies entspricht [, bis ein \ n gefolgt von einem [ oder am Ende der Zeichenfolge gefunden wird. Die Flags ms sind hier wichtig, damit ^ mit dem Anfang aller Zeilen und für . mit Zeilenumbrüchen übereinstimmt.

Oder mit Spaltung ...

print_r(preg_split("/\n(?=\[)/", $fileString));

Dies entspricht nur dann einem \ n , wenn ein [ folgt.

0
hinzugefügt
Genial. Schön gemacht. Vielen Dank.
hinzugefügt der Autor Evan, Quelle

Bitte beachten Sie die parse_ini_file() oder die parse_ini_string() Funktion, die bereits eine Datei im selben parst Formatieren Sie als smb.conf in ein Array mit den Konfigurationselementen.

Zum Beispiel mit der folgenden Konfiguration sample.ini (Beispiel aus parse_ini_file() -Dokumenten ) :

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

Der folgende Code:

$ini_array = parse_ini_file("sample.ini", true);
print_r($ini_array);

wird herstellen:

Array
(
    [first_section] => Array
        (
            [one] => 1
            [five] => 5
            [animal] => Dodo bird
        )

    [second_section] => Array
        (
            [path] => /usr/local/bin
            [URL] => http://www.example.com/~username
        )
)
0
hinzugefügt
Zunächst einmal schätze ich die Antwort. Schon ging diese Straße und es erfordert ein sehr strenges Format. In meinem Fall kann unglücklicherweise zwischen den Abschnittsheadern eine beliebige Anzahl von schrecklichem Text, Sonderzeichen, etc ... nicht nur x gleich y sein. Alles was ich sicher weiß ist, dass die Abschnitte mit der Klammer beginnen.
hinzugefügt der Autor Evan, Quelle
@Evan Autsch! Ja, in diesem Fall sind Sie besser mit einem benutzerdefinierten Parser.
hinzugefügt der Autor elias, Quelle
@ bluegman991 Ja, das habe ich gemerkt, deshalb habe ich gesagt, es zu überlegen - die Frage war nicht klar, ob es versucht wurde. =)
hinzugefügt der Autor elias, Quelle
@Evan Versuche es mit: preg_split ("/ ^ \ [[^ [] + \] \ n $ /", $ fileString) - Ich denke, der . * ist passend zum letzten ] gierig.
hinzugefügt der Autor elias, Quelle
Guter Vorschlag, aber er sagte, es sei ähnlich . Wenn es nicht dasselbe ist, müsste er sein Format ändern, so dass es genau dasselbe ist.
hinzugefügt der Autor bluegman991, Quelle

Entfernen Sie den ^ und den $ aus Ihrem Regex.

Dies führt dazu, dass das PHP nur mit einer öffnenden Klammer am Anfang der Zeichenfolge und einer schließenden Klammer am Ende der Zeichenfolge übereinstimmt.

$fileString = file_get_contents( '/tmp/file.txt' );
print_r( preg_split( "/\[.*\]\r?\n/", $fileString );

So etwas sollte für dich besser funktionieren.

0
hinzugefügt
Funktioniert völlig, aber die Header selbst fehlen. Ich schätze die Lösung jedoch, da ich sie woanders verwenden kann.
hinzugefügt der Autor Evan, Quelle
PHP - Deutsche Gemeinschaft
PHP - Deutsche Gemeinschaft
5 der Teilnehmer

In dieser Gruppe sprechen wir über PHP. Partner: de.switch-case.com