[REGEX] Help needed, Bedingtes Splitten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [REGEX] Help needed, Bedingtes Splitten

    Code:
    $x = 'hallo "Karl, Gustav und Otto", \'Wie geht\\\'s euch, 
    gut?\', Ich hoffe gut, sonst wäre ich traurig!';
    $x soll jetzt in ein Array umgewandelt werden. Das Trennzeichen ist das Komma, es sei denn, es steht zwischen (nicht escapten) " oder '

    Geünschte Ausgabe wäre also
    Code:
    Array
    (
        [0] => hallo "Karl, Gustav und Otto"
        [1] => 'Wie geht\'s euch, gut?'
        [2] => Ich hoffe gut
        [3] => sonst wäre ich traurig?
    )
    Aber irgendwie bin ich dazu nicht in der Lage, kann mir da jemand unter die Arme greifen?

    [code] verschluckt mittlerweile auch Backslashes, genauso wie \'normaler\' text?
    Zuletzt geändert von mrhappiness; 10.01.2005, 09:42.
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    Im ersten Prüflauf testen, ob das Komma zwischen escapten " oder ' steht und wenn nicht ein eigenes Trennzeichen einfügen (z.B. chr(1)).
    Dann im zweiten Lauf anhand chr(1) exploden und den Trenncode wieder entfernen.
    Dann solltest Du Dein gewünschts Array erhalten.

    Kommentar


    • #3
      Code:
      $x = str_replace('\\"', chr(1), $x);
      $x = str_replace('\\\\'', chr(2), $x);
      $x = preg_replace('%(".*),(.*")%sU', '$1'.chr(3).'$2', $x);
      $x = preg_replace('%(\\'.*),(.*\\')%sU', '$1'.chr(4).'$2', $x);
      Dann ein explode mit , als Trenner und dann jeden Eintrag wieder bearbeiten und die Ersetzung rückgängig machen?

      So hatte ich's schon, aber ich dachte, das geht vielleicht auch eleganter
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        Moin,

        ... hatte Langeweile ...

        preg_match_all('#[^,]*(?<=["\']).*,.*(?=["\'])(?<=[^"\']).*,.*(?=[^"\'])'
        . '|[^,]*(?<=["\']).*(?=["\'])(?<=[^"\']).*(?=[^"\'])'
        . '|[^"\']*,[^"\']*'
        . '|[^"\']*$#sU',$x,$ary);

        Leider noch verbugt

        Mit:

        $x = 'hallo "Karl, Gustav und Otto", \'Wie geht\\\'s euch,
        gut?\', Ich hoffe gut, sonst wäre ich traurig!';

        funktionierts, mit:

        $x = 'hallo "sdfsdfsdf" "Karl, Gustav und Otto", \'Wie geht\\\'s euch,
        gut?\', Ich hoffe gut, ddd "hallo welt" sonst \'ddd\' wäre ich traurig!';

        nicht ganz.

        Vielleicht hat jemand noch etwas mehr Langeweile und Lust das zu debuggen und zu kürzen


        Deine Variante würde ich bevorzugen.
        Zuletzt geändert von Sebastian W; 10.01.2005, 12:53.
        Grüsse,
        Sebastian


        Profil Flex Freelancer
        Twitter twitter.com/flashhilfe
        Web Flash und Flex Community

        Kommentar


        • #5
          PHP-Code:
          $pattern '%(".*"|'."'.*')%sU";
          preg_match_all($pattern$parts[1], $match);
          $match $match[0];
          $parts[1] = preg_replace($patternchr(1), $parts[1]);
          $values explode(','$parts[1]); 
          So hab ich's jetzt gemacht, die Werte, die mal in " und ' standen, werden dann per array_unshift und substr_replace wieder eingetragen.

          Gefällt mir zwar nicht ganz so gut, aber ich kann damit leben, es sei denn, jemand hat die ultimative Idee
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Original geschrieben von mrhappiness
            es sei denn, jemand hat die ultimative Idee
            Schonmal probiert da noch irgendwie preg_split mit zu verwenden???
            Zuerst trennen anhand der Anführungszeichen + beliebigen Zeichen und Ungreedy-Modifier und dem Flag, dass alles in's Array kommt.
            Dann das Array per foreach durchgehen und per explode trennen, falls ein Komma drin ist, und das natürlich nur, wenn der Wert des momentanen Indexes, nicht mit einem " oder ' beginnt.
            Hinterher per foreach alles zusammenbasteln, die Werte, wo kein Array ist, einfach hintereinander in einen Index, wenn das Feld ein Array ist, eben den ersten Teil noch zum Alten Index, dann den nächsten Index nehmen und da dann bis zum Ende, oder bis zum nächsten Komma reinschreiben usw. ich denke es sollte klar geworden sein ^^
            Übersichtlich ist die Methode und Buganfällig bestimmt auch nicht großartig...naja, außer du willst auch erlauben, dass einige Anführungszeichen als escaped gelten, dann werden die Patterns komplizierter und du kannst nicht mehr explode verwenden ^^"

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              Original geschrieben von ghostgambler
              Schonmal probiert da noch irgendwie preg_split mit zu verwenden???
              ja, kurz, aber..
              Zuerst trennen anhand der Anführungszeichen + beliebigen Zeichen und Ungreedy-Modifier und dem Flag, dass alles in's Array kommt.
              Dann das Array per foreach durchgehen und per explode trennen, falls ein Komma drin ist, und das natürlich nur, wenn der Wert des momentanen Indexes, nicht mit einem " oder ' beginnt.
              Hinterher per foreach alles zusammenbasteln, die Werte, wo kein Array ist, einfach hintereinander in einen Index, wenn das Feld ein Array ist, eben den ersten Teil noch zum Alten Index, dann den nächsten Index nehmen und da dann bis zum Ende, oder bis zum nächsten Komma reinschreiben usw. ich denke es sollte klar geworden sein ^^
              Übersichtlich ist die Methode und Buganfällig bestimmt auch nicht großartig...naja, außer du willst auch erlauben, dass einige Anführungszeichen als escaped gelten, dann werden die Patterns komplizierter und du kannst nicht mehr explode verwenden ^^"
              war mir zu einfach
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Original geschrieben von mrhappiness
                ja, kurz, aber..war mir zu einfach
                aha...aber zumindest hast du dann die Sicherheit, dass es funktioniert, auf jeden Fall, und wenn doch noch ein Fehler kommt, dann brauchst du keinen 2 Zeilen Pattern umschreiben

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar

                Lädt...
                X