Leerzeichen mal ignorieren, mal nicht

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

  • Leerzeichen mal ignorieren, mal nicht

    Code:
    Du hast gesagt:"Hallo Welt"
    soll werden:
    Code:
    Array
    (
        [0] => Array
            (
                [0] => Du
                [1] => hast
                [2] => gesagt:"Hallo Welt"
            )
    )
    Mit
    Code:
    ([^\s]+("[^"]")*)
    kommt aber
    Code:
    Array
    (
        [0] => Array
            (
                [0] => Du
                [1] => hast
                [2] => gesagt:"Hallo
                [3] => Welt"
            )
    )
    raus und das ist zwar ein Anfang, aber mehr auch nicht, hat da jemand eine tolle Idee?
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    mit ner condition scheints zu gehen, habs aber nicht ausführlich
    getestet.

    PHP-Code:
    preg_match_all('~("[\w\s]+")?("[\w\s]+")|(([\w]+[^\s])+)~'$str$m); 

    Kommentar


    • #3
      danke, gibt mir
      Code:
      Array
      (
          [0] => Array
              (
                  [0] => Du
                  [1] => hast
                  [2] => gesagt:
                  [3] => Hallo Welt
              )
      )
      also auch nicht das, was ich brauche
      Code:
      Array
      (
          [0] => Array
              (
                  [0] => Du
                  [1] => hast
                  [2] => gesagt:"Hallo Welt"
              )
      )
      Das liegt daran, dass der Doppelpunkt nicht von \w erfasst wird, da mus sich noch basteln

      Die Welt ist so kompliziert
      Zuletzt geändert von mrhappiness; 15.11.2004, 10:11.
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        hatte das mit dem ersten beispiel bischen übersehen,
        ich glaub das hatte ich zwischendurch mal einfacher.
        die kombination ist echt nicht ohne

        Kommentar


        • #5
          hab noch nix gefunden und mach es provisorisch jetzt mal so:
          PHP-Code:
          preg_match_all('~("[\\w\\s]+")?("[\\w\\s]+")|(([\\w]+[^\\s])+)~'$str$match);
          $words = array();
          foreach (
          $match[2] as $key => $value) {
              if (empty(
          $value)) {
                  
          $insertkey $key;
                  
          $words[] = $match[0][$key];
              }
              else
                  
          $words[$insertkey] = str_replace('""''":"'$words[$insertkey].$value);

          aber das gelbe vom ei isses natürlich noch nicht
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Das liegt daran, dass der Doppelpunkt nicht von \w erfasst wird, da mus sich noch basteln
            Ohne dass jetzt ausprobiert zu haben, wir wärs mit ner Zeichengruppe \w und Doppelpunkt ?


            An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

            Kommentar


            • #7
              so spuckt bekommst du die ausgabe wie oben, musste mal
              testen wie's real life klappt.

              Code:
              '~([^\s]+".+?".+?)?([^\s]+".+?".+?)|([^\s]+)~'

              Kommentar


              • #8
                PHP-Code:
                $test 'Du hast gesagt:"Hallo Welt":"Die Sonne: scheint "
                :"Das Essen\" ist gut" Weißt du noch?'
                ;
                preg_match_all('%("[^"]+")?([\\w]+([\\s]*:[\\s]*"[^"]+")+)|([^\\s]+)%'$test$match);
                print_r($match[0]); 
                gibt mir
                Code:
                Array
                (
                    [0] => Du
                    [1] => hast
                    [2] => gesagt:"Hallo Welt":"Die Sonne: scheint "
                :"Das Essen\"
                    [3] => ist
                    [4] => gut
                    [5] => Weißt
                    [6] => du
                    [7] => noch
                )
                sieht also schon fast gut aus
                Code:
                Array
                (
                    [0] => Du
                    [1] => hast
                    [2] => gesagt:"Hallo Welt":"Die Sonne: scheint "
                :"Das Essen\" ist gut"
                    [3] => Weißt
                    [4] => du
                    [5] => noch
                )
                wäre super.

                ich muss jetzt also noch ne Möglichkeit finden, dass er zwar von " bis " geht, aber escapte anführungszeichen \" ignoriert

                @.oOo.elias.oOo.
                Mit deinem Ausdruck komme ich genausoweit wie mit meinem jetzigem
                Zuletzt geändert von mrhappiness; 15.11.2004, 10:59.
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  glaub nicht das die sache mit den escapten doublequotes
                  zufriedenstellend funktionieren wird.

                  den : in deinem pattern würde ich mit \W ersetzen falls du noch
                  mehr non-word character hast die solche abschnitte trennen.

                  Kommentar


                  • #10
                    Da hier grad die REGEX-Experten am Werk sind, mal ne Frage:

                    Gibs eine Art "UND" ?

                    also z.B.

                    ein beliebiges Zeichen aber kein h und keine 7 und kein "

                    Wie schreibe ich sowas am besten ?

                    In den Tutorials sehe ich immer nur [^...] also eine gesamte zeichenklasse negiert und das | , also quasi ein Oder

                    aber wie verknüpfe ich das am besten ?


                    An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

                    Kommentar


                    • #11
                      ein beliebiges Zeichen aber kein h und keine 7 und kein "
                      entweder hast du ein schlechtes beispiel gewählt, oder aber
                      immer nur [^...] also eine gesamte zeichenklasse negiert
                      ist deine lösung.
                      Die Zeit hat ihre Kinder längst gefressen

                      Kommentar


                      • #12
                        ein wirkliches und gibts nicht, du musst halt die ganzen klassen
                        kombinieren bis es richtig matcht. du kannst ja ggf. feste strings
                        einbauen als anhaltspunkt.

                        foo[\w]+

                        wäre ja quasi ein foo-und-alle-wortcharakter.
                        da muss man ein bischen umdenken..

                        Kommentar


                        • #13
                          also müsste ich das so schreiben :

                          '#[.*][^h][^7][^"]#' ?

                          aber das wäre falsch, das wäre ja belibige zeichen und dann ein zeichen das kein h ist, dann eins dass keine 7 ist und dann eins dass nicht " ist

                          wie wende ich das alles auf ein zeichen an ?

                          so:

                          (.*|^h|^7|^")


                          An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

                          Kommentar


                          • #14
                            [^h7"] geht nicht?

                            was willst du denn machen?
                            beispiel?
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              Ich wollte jetzt in deinem beispiel folgendes machen :

                              " beliebiges zeichen, aber kein leerzeichen "

                              also '/".*[^\s]"/'

                              aber dann sagt er ja erst ein belibiges zeichen und dann eins dass kein whitespace is

                              nach kurzem überlegen also

                              '/"[^\s]*"/' wäre richtig oder ?


                              An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

                              Kommentar

                              Lädt...
                              X