2016-06-25 18 views
1

Ich habe eine Config-Datei, die ein bisschen wie dies Dies ist in einer Datei config.confSplitting eine Datei in entsprechende Abschnitte in PHP

Blah 
Diddel 
Foo 
Bar1 
Bar2 
One 
XXY 
Password%1 = something 
Password%2 = other 
Password%3 = nuffing 
Completely different stuff here 
RandomS6}=2 
User%1 = Henry 
User%2 = Marcus 
User%3 = SecretAdmin 
More stuff 
Even more stuff 
Loads of stuff 

sieht, dass ein User-Uploads über PHP Form. Ich möchte, dass die Datei lesen und erstellen 5 neue Dateien aus ihm wie folgt:

  1. alle Linien von Anfang an bis einschließlich der Linie XXY
  2. Alle ‚Passwort% ...‘ Linien
  3. die Linien zwischen dem letzten 'Passwort ...' und dem ersten 'Benutzer ...' line
  4. All 'User ...' Linien
  5. Alles unterhalb der 'User ...' Linien

Nun ist die String-Matching ich umgehen kann, regex würde süß sein, aber da es eine Config mit einem strengen Format ist, kann ich es bodge mit

while (substr($line,0,5) == "Passw" { ...

Was ich nicht meinen Kopf bekommen um die strukturelle Art und Weise . Ich begann mit verschachtelten if-Schleifen, aber dass a) mir irrsinnig ineffizient erscheint (jede Zeile nach dem 'User ...' Block wird immer noch nach 'Passwort ...' getestet) und b) sieht es nicht nur matschig aus ist auch ein Albtraum zu debuggen.

Es muss einen cleveren Weg geben, dies zu tun? Ich stelle mir das vor wie Karten austeilen - "fange an Deck an, ziehe Karten in diesen Stapel, bis 'x' passiert, dann hole Karten in einen anderen Stapel, bis 'y' passiert usw." aber ich bin nicht genug von einem Programmierer, um mich darum zu kümmern.

Ich habe eine Menge Googeln und hier getan - aber ich bekomme Seiten, die mir sagen, wie man in Kommas teilen oder nach Anzahl der Zeilen, aber kein Tutorial semantisch aufteilen, sozusagen?

Vielen Dank für Hinweise!

P.S. - Muss nicht PHP sein, wenn etwas viel besser für diese Rolle geeignet ist. Aber ich bin ein Anfänger bei Ruby und ein Baby bei Python - PHP ist, was ich ein bisschen besser als alles andere weiß.

+0

Der von Ihnen beschriebene "Dealing Cards" -Algorithmus kann in Python einfach mit 'itertools' implementiert werden. * (es ist auch nicht sehr kompliziert mit anderen Sprachen) *. –

+0

itertools bookmarked. Für diese Aufgabe ist die Lernkurve zu steil, aber es sieht so aus, als ob es sich lohnt, etwas Zeit zu investieren. Vielen Dank! – sheepsky

Antwort

0

Der Ansatz, den ich wählte, wird in vier Schritten sectionizing:

  1. Spiel bekannt .conf Variablen/Trennzeichen und speichert sie (Passwort, Benutzer, XXY)
  2. abgestimmt Saiten Ersetzen durch nichts (Auslassen)
  3. Split neu modifizierten Zeichenfolge in Abschnitte
  4. Merge (1) und (3)
Hier

ist der Code:

$matches = []; 
$string = preg_replace_callback(
     '~^(?>User.+|Password.+|XXY)$~m', 
     function ($match) use (&$matches) { 
      @$matches[substr($match[0], 0, 4)] .= $match[0]; 
      return null; 
     }, 
     $input 
    ); 

print_r(array_merge($matches, preg_split('/^\s+$/m', $string))); 

Ergebnis ist ein bisschen böse und nicht ganz in Ordnung (ein bisschen mehr Arbeit, es zu tun), aber Sie haben, was Sie wollen (Live demo):

Array 
(
    [XXY] => XXY 

    [Pass] => Password%1 = something 
Password%2 = other 
Password%3 = nuffing 

    [User] => User%1 = Henry 
User%2 = Marcus 
User%3 = SecretAdmin 

    [0] => Blah 
Diddel 
Foo 
Bar1 
Bar2 
One 

    [1] => 
Completely different stuff here 
RandomS6}=2 

    [2] => 
More stuff 
Even more stuff 
Loads of stuff 
) 
+0

Whoa, das ist es, fantastisch! Danke vielmals! – sheepsky

+0

Gern geschehen. Wenn dies Ihre Frage beantwortet, können Sie diese als akzeptiert markieren, indem Sie auf das Häkchensymbol klicken. @sheepsky – revo

+0

hat mich eine Weile gebraucht, um es zu finden - jetzt überprüft. Danke noch einmal! – sheepsky