preg_split() Text nach Zeichen splitten, aber nicht bei bestimmten Wörtern

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

  • preg_split() Text nach Zeichen splitten, aber nicht bei bestimmten Wörtern

    Hi,
    ich möchte mit preg_split() einen String aufsplitten. Trenner sollen die Zeichen .,! sowie Zeilenumbruch sein.

    Mit
    PHP-Code:
    $split preg_split("/[\.,!] |\n/"$text, -1PREG_SPLIT_NO_EMPTY ); 
    klappt das so weit auch wunderbar.

    Jetzt kommen in manchen Texten aber Abkürzungen vor, die die vorgenannten Zeichen (z.B. einen Punkt) enthalten, bei denen nicht getrennt werden soll.

    Beispiel:
    PHP-Code:
    $text "Lederjacke! Bordeaux, imprägniert, inkl. Innenfutter mit Reißverschluss, 1 Jahr alt";

    $split preg_split("/[\.,!] |\n/"$text, -1PREG_SPLIT_NO_EMPTY );
    foreach(
    $split as $splittext)
    {
        
    $x .= $br $splittext;
        
    $br "<br />";
    }    
    echo 
    $x
    ergibt:
    Lederjacke
    Bordeaux
    imprägniert
    [COLOR=blue]inkl
    Innenfutter mit Reißverschluss[/COLOR]
    Sonderpreis

    So hätte ich es gerne:
    Lederjacke
    Bordeaux
    imprägniert
    [COLOR=darkred]inkl. Innenfutter mit Reißverschluss[/COLOR]
    Sonderpreis


    Wie muss ich nun den Ausdruck gestalten, dass die Worte "inkl." und "incl." nicht zum Trennen des Textes führen?

    Gruß
    Henry

  • #2
    Stichwort negativer lookahead, bzw. lookbehind.

    Kommentar


    • #3
      Re: preg_split() Text nach Zeichen splitten, aber nicht bei bestimmten Wörtern

      Original geschrieben von HenryH
      Hi,
      ich möchte mit preg_split() einen String aufsplitten. (...) Beispiel:
      PHP-Code:
      $text "Lederjacke! Bordeaux, imprägniert, inkl. Innenfutter mit Reißverschluss, 1 Jahr alt";

      $split preg_split("/[\.,!] |\n/"$text, -1PREG_SPLIT_NO_EMPTY );
      foreach(
      $split as $splittext)
      {
          
      $x .= $br $splittext;
          
      $br "<br />";
      }    
      echo 
      $x
      Warum mit preg_split()? Wenn du einfach die "Trennzeichen" ersetzen willst, tuts doch auch preg_replace():

      PHP-Code:
      $text 'Punkt. Punkt. Test incl. Lederjacke! Bordeaux, imprägniert, '.
              
      'inkl. Innenfutter mit Reißverschluss, 1 Jahr alt';

      $x preg_replace('/(?:[,!]|(?<!in[ck]l)\.)\s+/''<br />'$text); 
      Wie muss ich nun den Ausdruck gestalten, dass die Worte "inkl." und "incl." nicht zum Trennen des Textes führen?
      Code:
      '/               # finde
        (              # entweder
        [,!]           # Komma, Ausrufezeichen
        |              # ODER
        (?<!in[ck]l)\. # Punkt, vor dem KEIN "inkl"|"incl" steht
        )              #
        \s+            # UND dazu ein bis mehrere Leerzeichen (Whitespace)
      /x'
      (Fehlende Backslashes bitte wie immer aus der Zitat-Ansicht holen ...)

      Du solltest aber bedenken, dass dieser Trick nur bei gleichlangen Buchstabenfolgen vor dem Punkt funktioniert. Die negative Lookbehind-Assertion "(?<! ... )" funktioniert nämlich nur in Ausnahmefällen mit variablen Längen -- "inkl" und "incl" sind zufälligerweise gleich lang, da stellt das kein Problem dar.
      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

      Kommentar


      • #4
        Hi,
        vielen Dank schon mal für die Tipps. Das scheint in die richtige Richtung zu gehen, funktioniert aber nach dem Beispiel von fireweasel noch nicht so ganz.

        Ergebnis mit preg_split():
        Lederjacke! Bordeaux, imprägniert, inkl. Innenfutter mit Reißve
        chl
        , Sonderpre

        preg_split() verwende ich deshalb, weil ich die Zeichen nicht ersetzen, sondern in ein Array schreiben will. Ich habe das, um es nicht zu komplizieren, gegen <br /> ersetzt, u.a. damit man den Erfolg auch gleich betrachten kann. So habe ich wohl ein Mißverständnis geschaffen.

        Ich habe damit nun noch ein wenig weiter rumexperimentiert , komme aber nicht wirklich weiter.

        @fireweasel
        hast Du da noch eine Idee, was ich tun muß?

        Gruß
        Henry

        Kommentar


        • #5
          Original geschrieben von HenryH
          ...
          preg_split() verwende ich deshalb, weil ich die Zeichen nicht ersetzen, sondern in ein Array schreiben will. Ich habe das, um es nicht zu komplizieren, gegen <br /> ersetzt, u.a. damit man den Erfolg auch gleich betrachten kann. So habe ich wohl ein Mißverständnis geschaffen.
          Ja, so könnte man das wohl ausdrücken. ;-)

          Ich habe damit nun noch ein wenig weiter rumexperimentiert , komme aber nicht wirklich weiter.
          Hmmm, ich finde keinen Fehler ...
          Ich hab exakt den gleichen PCRE mit preg_split() eingesetzt, also:

          PHP-Code:
          $teile preg_split('/(?:[,!]|(?<!in[ck]l)\.)\s+/'$text); 
          ... und bekomme damit auch das gleiche Ergebnis, nur eben als PHP-Array ohne die <br />-Elemente.
          Wichtig:
          1. Keine weiteren Parameter für preg_split().
          2. Hole dir den PCRE aus der Zitat-Ansicht, sonst fällt der Backslash unter den Tisch, der hier sehr wichtig ist, er macht nämlich aus dem Zeichen mit Spezialbedeutung "."[1] einen gewönlichen Punkt.
          --
          [1] "." Bedeutet in regulären Ausdrücken üblicherweise: (Fast) jedes beliebige Zeichen.
          Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

          Kommentar


          • #6
            Trennungszeichen mit preg_replace behalten

            Hi Fireweasel,


            Dein Skript

            PHP-Code:
            $text 'Punkt. Punkt. Test incl. Lederjacke! Bordeaux, imprägniert, '
                    
            'inkl. Innenfutter mit Reißverschluss, 1 Jahr alt'

            $x preg_replace('/(?:[,!]|(?<!in[ck]l)\.)\s+/''<br />'$text); 
            funkioniert wunderbar.

            Die Frage wäre, wie kann man die Trennungszeichen dabei behalten, sodass

            PHP-Code:
            für ":" => ':<br />'$text);
            für "?" => '?<br />'$text);
            für "." => '.<br />'$text);

            usw
            Und, um alles schwieriger zu machen, hier

            PHP-Code:
            $x preg_replace('/(?:[,!]|(?<!in[ck]l)\.)\s+/''<br />'$text);  


            sollten auch andere Abkürzung enthalten sein:

            u.a., z.B., usw., Nr., 1.2.3.4.5.6.7.8.9.10. 
            Mir fällt gerade WENN, IF, ELSE... mal sehen wie das aussehen könnte

            Zuletzt geändert von DeSena; 20.09.2010, 00:35.

            Kommentar


            • #7
              Zitat von DeSena Beitrag anzeigen
              Die Frage wäre, wie kann man die Trennungszeichen dabei behalten
              Stichwort: Back-References
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar

              Lädt...
              X