acidfreak: regex für multiline

ich habe eine datei mit einem mulitline text. sieht ungefähr so aus:

<key>name</key><string>Engelstaub1</string>
<key>secondname</key><string>Im Jahr des Drachen2</string>
<key>uselessdata</key><string>Engelstaub3</string>
<key>uselessdatta2</key><string>Im Jahr des Drachen4</string>
<key> uselessdata 4</key><string>Engelstaub5</string>
<key> uselessdata 5</key><string>Im Jahr des Drachen6</string>

<key>name</key><string>1Engelstaub1</string>
<key>secondname</key><string>1Im Jahr des Drachen2</string>
<key>uselessdata</key><string>1Engelstaub3</string>
<key>uselessdatta2</key><string>1Im Jahr des Drachen4</string>
<key> uselessdata 4</key><string>1Engelstaub5</string>
<key> uselessdata 5</key><string>1Im Jahr des Drachen6</string>

<key>name</key><string>2Engelstaub1</string>
<key>secondname</key><string>2Im Jahr des Drachen2</string>
<key>uselessdata</key><string>2Engelstaub3</string>
<key>uselessdatta2</key><string>2Im Jahr des Drachen4</string>
<key> uselessdata 4</key><string>2Engelstaub5</string>
<key> uselessdata 5</key><string>2Im Jahr des Drachen6</string>

aus diesem Text benötige ich aber in php nur die Felder mit <key>name</key><string>*inhalt</string>
und <key> secondname </key><string>* inhalt </string>

die große frage ist jetzt wie kann ich im Endeffekt alles andere löschen als diese Felder die mehrmals vorkommen nur mit anderem Inhalt im <string>.
hätte schon probiert das ganze mit regex zu durchforsten und die Ergebnisse einfach inne variable zu schreiben das Problem ist nur die expression:
<key>name</key><string>(.*)</string>
ersetzt einfach das (.*) vom ersten <string> des Textes bis zum letzten. was nicht hilfreich ist.
ich hoffe ich habe mich verständlich ausgedrückt. habe auch schon diverse regex Informationen bei mozilla und ähnlichen wikis durchforstet - konnte aber nichts finden.
mein einziger Ansatz währe der Regel (.*) noch etwas beizufügen was zB <string> rausstreicht.

lg
klemens

  1. gudn tach klemens!

    ich hoffe ich habe mich verständlich ausgedrückt.

    ehrlich gesagt: nicht so, dass ich es verstanden habe.

    willst du eine js- oder eine php-loesung?

    ich habe dich so verstanden, als habest du eine datei und willst mit php nur bestimmte zeilen auslesen.
    wenn du die zeilen in ein array eingelesen hast, kannst du mittels preg_grep diejenigen zeilen extrahieren, die du wirklich haben moechtest. z.b. so:

    $res = preg_grep("/^<key>(?:name|secondname)<\/key><string>.*<\/string>$/", $array)

    prost
    seth

    1. hallo seth.

      bin leider im übereifer meist schwer verständlich ;)

      also ganz klar strukturiert jetzt:

      1. Ausgangsituation:
      1 große datei. mit sehr viel inhalt >30mb. inhaltlich unter anderem der sich öfters wiederholende passus mit verschieden inhalten zwischen <string>+</string>:
      "<key>name</key><string>(HIER VARIABLER INHALT)</string>"
      und "<key>secondname</key><string>(HIER VARIABLER INHALT)</string>"
      wobei für mich rein der zweiter teil sprich das zwischen <string>*</string> vonnöten ist.
      diese daten (nur die genannten zeilen die öfters vorkommen) möchte ich nun mit php verarbeiten.

      2. Problem
      Die datei ist sehr groß von daher währe der plan einfach die datei zu zerstückeln (browserseitig per js) und nur die nötige information (siehe oben) auf den server zu hiefen.

      3. Frage
      wie kann ich aus einer datei mit sehr viel inhalt nur die passagen die
      "<key>name</key><string>(HIER VARIABLER INHALT)</string>"
      und "<key>secondname</key><string>(HIER VARIABLER INHALT)</string>"
      heißen an php senden?

      mein ansatz währe gewesen die datei mithilfe von
      <key>name</key><string>(.*)</string>
      zu durchsuchen. wenn etwas gefunden wurde, ergebniss in ne variable kopieren weitersuchen. das funktioniert aber nicht da bei meiner suchexpression
      (.*) duch den kompletten text ersetzt wird bist zum letzten </string> sprich nur 1 suchergebnis.

      mfg, danke für die hilfe
      klemens

      1. gudn tach!

        ganz habe ich es noch nicht verstanden.

        du willst also eine datei, die sich auf deiner festplatte befindet, per formular (oder sonstwie?) an ein php-script auf einem server senden.
        allerdings ist die datei sehr gross, weshalb du nur den relevanten teil senden moechtest.

        um welches betriebssystem handelt es sich beim dem client?
        spricht etwas dagegen, dass du die datei einfach vorher auf deiner festplatte bearbeitest?
        unter linux koenntest du einfach via "sed" die datei in eine neue gekuerzte kopieren und _dann_ versenden.

        mein ansatz währe gewesen die datei mithilfe von
        <key>name</key><string>(.*)</string>
        zu durchsuchen. wenn etwas gefunden wurde, ergebniss in ne variable kopieren weitersuchen. das funktioniert aber nicht da bei meiner suchexpression
        (.*) duch den kompletten text ersetzt wird bist zum letzten </string> sprich nur 1 suchergebnis.

        vielleicht wuerde dir schon (.*?) stattdessen helfen. ansonsten poste doch einfach mal deinen bisherigen relevanten code.

        prost
        seth

      2. Hallo klemens,

        mein ansatz währe gewesen die datei mithilfe von
        <key>name</key><string>(.*)</string>
        zu durchsuchen. wenn etwas gefunden wurde, ergebniss in ne variable kopieren weitersuchen. das funktioniert aber nicht da bei meiner suchexpression
        (.*) duch den kompletten text ersetzt wird bist zum letzten </string> sprich nur 1 suchergebnis.

        Wie @seth schon andeutete, liegt das daran, dass der Ausdruck "(.*)</string>" sehr gierig ist, d.h. er frisst alles bis zum letzen Vorkommen von "</string>". Der Ausdruck "(.*?)</string>" stellt diese Gier ab, dann wird nur noch das zurückgegeben, was vor dem nächsten "</string>" steht.

        Gruß, Don P