RomanD: regulärer Ausdruck gesucht

Hi,

ich suche einen regulären Ausdruck für ereg_replace, der alle \r\n zwischen zwei Anführungsstrichen " durch 2 Leerzeichen ersetzt.
\r\n ausserhalb von Anführungsstrichen sollen erhalten bleiben.

Kann mir jemand weiterhelfen?

Gruß

  1. ich suche einen regulären Ausdruck für ereg_replace, der alle \r\n zwischen zwei Anführungsstrichen " durch 2 Leerzeichen ersetzt.

    Warum ereg_replace, wenn Du die POSIX-Erweiterungen eigentlich nicht brauchst? Und warum überhaupt Reguläre Ausdrücke, ein einfaches str_replace sollte es auch tun. Beispiele zur Verwendung auch bei Steuerzeichen findest Du im PHP-Handbuch.

    Siechfred

    --
    Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
    1. Hello Siechfred,

      Warum ereg_replace, wenn Du die POSIX-Erweiterungen eigentlich nicht brauchst? Und warum überhaupt Reguläre Ausdrücke, ein einfaches str_replace sollte es auch tun. Beispiele zur Verwendung auch bei Steuerzeichen findest Du im

      Ich glaube, dass das eine echt knifflige Aufgabe ist, es hört sich jedenfalls viel einfacher an, als es ist.

      Es lässt sich noch nicht einmal "ganz einfach" mit den neulich hier diskutierten Assertions und preg_replace() bearbeiten, weil es bei den üblichen Quotations keine öffnenden und schließenden gibt.

      Für str_replace ist das daher schon gar keine Aufgabe.

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. Ich glaube, dass das eine echt knifflige Aufgabe ist, es hört sich jedenfalls viel einfacher an, als es ist.

        Nö, es ist ganz simpel: Ersetze in einem String alle „"\r\n"“ durch „"  "“. Ansonsten lasse ihn, wie er ist.

        Es lässt sich noch nicht einmal "ganz einfach" mit den neulich hier diskutierten Assertions und preg_replace() bearbeiten, weil es bei den üblichen Quotations keine öffnenden und schließenden gibt.

        Sorry, mir ist, als stünde ich auf dem Bahnhof eines gottverlassenen böhmischen Dorfes. Spielst Du auf Lookarounds an? Die braucht man hier doch überhaupt nicht?!

        Für str_replace ist das daher schon gar keine Aufgabe.

        Na aber sicher doch:

        $s = str_replace('"\r\n"', '"__"', 'Mit: "\r\n", ohne: \r\n. Nochmal: "\r\n", \r\n.');  
        echo $s;
        

        Siechfred

        --
        Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
        1. Hi,

          Siechfred, so einfach ist es leider nicht ;)
          Der Text enthält nicht einfach "\r\n" sondern, z.B.
          "Ich bin\r\n
          ein\r\n
          Beispiel".
          Daraus soll dann "Ich bin  ein  Beispiel" werden

          Gruß

          1. Hello,

            Siechfred, so einfach ist es leider nicht ;)
            Der Text enthält nicht einfach "\r\n" sondern, z.B.
            "Ich bin\r\n
            ein\r\n
            Beispiel".
            Daraus soll dann "Ich bin  ein  Beispiel" werden

            Das Beispiel hier ginge nit Siechfreds Lösung schon.
            Ich habe Dich aber anders verstanden.

            $text =  "Der Text enthält ein Beispiel:\r\n"Ich bin\r\nein\r\nBeispiel"\r\nund ist daher etwas komplexer\r\n";

            echo "<pre>\n";
            echo $text;
            echo "</pre>\n";

            War es so gemeint?
            Und nun sollen nur die \r\n ersetzt werden, die im Text zwischen Anführungszeichen auftreten.
            Die äußeren Anführungszeichen gehören ja nichbt zum Text, sondern sie "gehören dem Parser"...

            Harzliche Grüße vom Berg
            http://bergpost.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

            1. Hintergrund ist, dass ich einen Export des Adressbuchs in OutlookExporess in eine Datenbank einlesen will.
              Ich hab das Adressbuch in eine CSV-Datei exportiert.
              Im Feld Notizen werden in der Datei aber Zeilenumbrüche mit angezeigt. Die will ich entfernen, weil die Funktion fgetcsv() damit Probleme hat.

              Eine Zeile sieht vereinfacht z.B. so aus:

              Herr;Klaus;Mustermann;klaus.mustermann@web.de;Musterstraße 1;Musterhausen;"Ich bin
              eine mehrzeilige
              Notiz"

              1. Hello Roman,

                Eine Zeile sieht vereinfacht z.B. so aus:

                Herr;Klaus;Mustermann;klaus.mustermann@web.de;Musterstraße 1;Musterhausen;"Ich bin
                eine mehrzeilige
                Notiz"

                Hast Du die Zeile aus einer Datei?
                Dann ist es eine mit "unvollständiger CSV-Notation".
                Wenn Du diese dann statt mit fgets() oder fread() mit fgetcsv() ausliest, dann hast Du schon alle Felder eines Satzes in einzelnen Elementen
                http://de2.php.net/manual/en/function.fgetcsv.php
                und dann kannst Du die \r\n ganz einfach austauschen. Die Häkchen sind dann schon verschwunden.

                $_table = array();

                while (false !== ($_rec = fgetcsv($dateihandle, $maxlen))
                  {
                    $_table[] = $_rec;
                  }

                echo "<pre>\n";
                  echo htmlspeialchars(print_r($_table,1));
                  echo "</pre>\n";

                Schau es Dir an...

                Harzliche Grüße vom Berg
                http://bergpost.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                1. Ja so hatte ich es auch schonmal.
                  Aber die Funktion nimmt jede Zeile als neuen Dateisatz.

                  1. Hello,

                    Ja so hatte ich es auch schonmal.
                    Aber die Funktion nimmt jede Zeile als neuen Dateisatz.

                    Welche "jede Zeile?"

                    Hast Du die "Enclosures" und die "Delimiters" (eigentlich 'Seperator') auch angegeben?

                    Harzliche Grüße vom Berg
                    http://bergpost.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau
                    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                    1. Ja,

                      while ($zeile = fgetcsv($handle,10000,";","""")) {
                      [...]
                      }

                      Da liest der immer nur bis zum ersten Zeilenumbruch ein.

                      1. Hello,

                        while (false !== ($zeile = fgetcsv($handle, 10000, ';', '"')))
                          {
                           ## [...]
                          }

                        So ist es leichter ersichtlich, wie es haeißen muss.
                        Du hattest ein Häkchen zuviel als "enclosure" angegeben. Da hat der Parser das wahrscheinoich gänzlich ignoriert.

                        Harzliche Grüße vom Berg
                        http://bergpost.annerschbarrich.de

                        Tom

                        --
                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                        Nur selber lernen macht schlau
                        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                        1. Ne daran lags auch nicht :)
                          Immernoch das gleiche Ergebnis

                          1. Hello,

                            Ne daran lags auch nicht :)
                            Immernoch das gleiche Ergebnis

                            Dann poste doch mal einen Ausschnitt aus dem dargestellten Array

                            Hast Du Dir die Datei mal mit einem Hexeditor angeschaut?
                            Welche Zeilenendezeichen werden benutzt?
                            Welche Zeilenschaltungszeichen stehen in den Feldern?

                            Ich habe mit fgetcsv() seit php >= 4.3.x keinerlei Probleme mehr gehabt.

                            Harzliche Grüße vom Berg
                            http://bergpost.annerschbarrich.de

                            Tom

                            --
                            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                            Nur selber lernen macht schlau
                            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                          2. Hello,

                            Ne daran lags auch nicht :)
                            Immernoch das gleiche Ergebnis

                            Ich habe nun extra mal mein Outlook-Express-Adressbuch exportiert und mir das angesehen.
                            Es funktioniert alles so wie vorgesehen.
                            Keinerlei Fehler und auch, wenn im Kommentarfeld Häkchen drinstehen, funktioniert alles zufriedenstellend.

                            Du müsstest Deinen Fehler schon noch etwas näher beschreiben und auch, wie Du die exportierte Datei bisher transferiert und behandelt hast. Ich kann mir nur vorstellen, dass Du auf dem Wege von der WinDOSe zum Webserver etwas "vergurkt" hast.

                            Harzliche Grüße vom Berg
                            http://bergpost.annerschbarrich.de

                            Tom

                            --
                            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                            Nur selber lernen macht schlau
                            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                            1. Hello Roman,

                              Ne daran lags auch nicht :)
                              Immernoch das gleiche Ergebnis

                              Ich habe nun extra mal mein Outlook-Express-Adressbuch exportiert und mir das angesehen.
                              Es funktioniert alles so wie vorgesehen.
                              Keinerlei Fehler und auch, wenn im Kommentarfeld Häkchen drinstehen, funktioniert alles zufriedenstellend.

                              Welche Outlook-Version benutzt Du?
                              Ich habe den Fehler gefunden.
                              Outlook 5.5 macht einen Fehler beim Export der Datei.
                              Häkchen im Feldinhalt werden nicht maskiert.

                              Wenn ein Doppelhäkchen im Feldwert vorkommt, muss es durch Verdopplung maskiert werden. Outlook Express 5.5 "vergisst" das einfach.
                              Wie es mit anderen Versionen ist, kann ich im Moment nachvollziehen.

                              Die Exportdatei vorhin war ordnungsgemäß maskiert, deshalb hat es auch funktioniert.

                              Ob sich das reparieren lässt, kann ich im Moment nicht sagen. Ich denke aber nicht.

                              Harzliche Grüße vom Berg
                              http://bergpost.annerschbarrich.de

                              Tom

                              --
                              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                              Nur selber lernen macht schlau
                              Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                              1. Also ich hab mir die Werte mal ausgeben lassen und ich muss zu meiner Schande gestehen, dass der Fehler doch in meinem Skript lag ;)

                                Ich benutzte OE6, kann ich das irgendwie auf 5 downgraden um mir den Fehler beim Export mal anzusehen?

                                1. Hello,

                                  Also ich hab mir die Werte mal ausgeben lassen und ich muss zu meiner Schande gestehen, dass der Fehler doch in meinem Skript lag ;)

                                  Ich benutzte OE6, kann ich das irgendwie auf 5 downgraden um mir den Fehler beim Export mal anzusehen?

                                  Sei froh, wenn es den Exportfehler nicht mehr macht.
                                  Wird denn bei OE 6 das Häkchen im Feldwert durch Verdopplung maskiert?

                                  Du kannst Dir eine solche korrupte CSV-Datei mit jedem beliebigen Texteditor erzeugen.
                                  Es reichen doch schon fünf Datensätze mit jeweils drei bis fünf Feldern...

                                  Wenn Du dann irgendwo im Text ein bis n Häkchen einfügst, ohne sie zu maskieren, ist das Chaos perfekt.

                                  Harzliche Grüße vom Berg
                                  http://bergpost.annerschbarrich.de

                                  Tom

                                  --
                                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                  Nur selber lernen macht schlau
                                  Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                    2. Hello,

                      Hast Du die "Enclosures" und die "Delimiters" (eigentlich 'Seperator') auch angegeben?

                      Vielleicht musst Du noch "auto_detect_line_endings" einstellen?

                      http://de2.php.net/manual/en/ref.filesystem.php#ini.auto-detect-line-endings

                      Harzliche Grüße vom Berg
                      http://bergpost.annerschbarrich.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      Nur selber lernen macht schlau
                      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

              2. Hello,

                Ich hab das Adressbuch in eine CSV-Datei exportiert.
                Im Feld Notizen werden in der Datei aber Zeilenumbrüche mit angezeigt. Die will ich entfernen, weil die Funktion fgetcsv() damit Probleme hat.

                Irgendwie bin ich immer noch halb blind...
                Da steht es ja, dass die Daten aus einer CSV-Datei kommen.

                fgetcsv() hat keine Probleme mit derartigen Dateien. Du musst nur beide Funktionsargumente angeben.

                Bei PHP nennen die das

                $delimiter          das wäre hier die Semicolen
                  $enclosure          das wären hier die doppelten Häkchen

                Was dann innerhalb der Doppelhäkchen in einem Feld steht, ist fgetcsv() erstmal egal.

                Harzliche Grüße vom Berg
                http://bergpost.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)