AllesMeins: Text nach 150 Zeichen schneiden und nicht alles mitzählen

Hiho,

folgendes Problem. Ich möchte gernen einen Text nach 150 Zeichen abschneiden, dabei sollen allerdings Text der von zwei Unterstrichen eingeschlossen ist nicht mitgezählt werden. Also kleines Beispiel mit Schnitt nach 15 Zeichen:

Text1: "Irgend eine möglichst belangloser Text"
Text2: "Heute ist __ein wunderschöner sonniger__ Tag und ich bin froh"

Text 1 würde ganz normal nach 15 Zeichen geschnitten werden, es bliebe also "Irgend eine mög" übrig. Hingegen soll Text2 auch nach 15 zeichen geschnitte werden, dabei sollen die __ und alles was sie umrahmen aber nicht mitgezählt werden, also "Heute ist __ein wunderschöner sonniger__ Tag " (15 Zeichen ausserhalb der Unterstriche). Hat irgendwer eine Idee wie sich soetwas realisieren lässt?
Am liebsten wäre mir noch wenn der Text jeweils an der ermittelten Stelle in einen Array zerteilt wird, also der Rest vom text nicht einfach verworfen wird sondern ich ihn auch noch zur Verfügung habe.

Grüsse

Marc

  1. Hi AllesMeins,

    Hat irgendwer eine Idee wie sich soetwas realisieren lässt?

    Eine fertige Funktion dafür kenne ich nicht - es wird aber mit den String-Funktionen lösbar sein. Ich habe mich gerade mal hingesetzt und ein kleines Script geschrieben, was die gewünschte Aufgabe löst:

    <?php  
      
    // Konfiguration  
    $string  = "Ein kleiner __und sinnloser__ Text mit Lore Ipsum";  
    $letters = 17;  
      
    // Ein paar Variablen zum Kontrollieren des Programmablaufes  
    $position    = 0;     # Aktuelle Position im String  
    $counter     = 0;     # Zähler, wie viele Buchstaben wir schon haben  
    $in_nocount  = false; # Befinden wir uns innerhalb von __ ?  
    $new_string  = "";    # Neuer String  
    $rest_string = "";    # Restlicher String  
      
    // Solange wir noch nicht genug Buchstaben haben  
    while($counter < $letters)  
    {  
        // Nächsten Buchstaben herrausschneiden  
        $char = substr($string, $position, 1);  
        // Sofern es den Anfang oder das Ende eines __ Bereiches darstellt  
        if($char == "_" AND substr($string, $position + 1, 1) == "_")  
        {  
            $new_string .= "__";  
            // Setze Kontrollvariable $in_nocount auf deren Gegenteil  
            $in_nocount = $in_nocount ? false : true;  
            // Und arbeite zwei Zeichen weiter im String  
            $position += 2;  
        }  
        // andernfalls, wenn wir irgendwo im Text sind  
        else  
        {  
            // Zeichen dem neuen String hinzufügen  
            $new_string .= $char;  
            // Wenn wir uns nicht in einem __ Bereich befinden, Counter  
            // hochzählen  
            if(!$in_nocount)  
            {  
                $counter ++;  
            }  
            // Position um eins erhönhen für nächsten Durchlauf  
            $position ++;  
        }  
    }  
    // Rest des Strings ins $rest_string schreiben  
    $rest_string = substr($string, $position);  
      
    // Ausgabe der Daten  
    echo "<pre>";  
    echo "Vorgabe:      $string\n";  
    echo "Neuer String: $new_string\n";  
    echo "Rest String:  $rest_string";  
    echo "</pre>";  
      
    ?>
    

    Soweit ich das bis jetzt getestet habe, funktioniert es einwandfrei.

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Die FlatBox 0.3 mit Dokumentation ist da!
    Man sollte nie aufhören zu fragen (Albert Einstein)
    ... aber natürlich erst, nachdem man sämliche FAQ's und Archive durchgelesen hat :-P
    1. Hiho,

      vielen Dank! Ich werde noch ein wenig dran rumbasteln aber im grossen und ganzen ist das genau das, was ich gebraucht habe.

      Viele Grüsse

      Marc

  2. echo $begrüßung;

    Ich möchte gernen einen Text nach 150 Zeichen abschneiden, dabei sollen allerdings Text der von zwei Unterstrichen eingeschlossen ist nicht mitgezählt werden.
    Hat irgendwer eine Idee wie sich soetwas realisieren lässt?

    Mit einem (ungierigen) Regulären Ausdruck können die __Textstellen__ entfernt werden. Danach kannst du mit substr() den Text auf Länge kürzen.

    Am liebsten wäre mir noch wenn der Text jeweils an der ermittelten Stelle in einen Array zerteilt wird, also der Rest vom text nicht einfach verworfen wird sondern ich ihn auch noch zur Verfügung habe.

    Auch das geht mit einem weiteren substr().

    echo "$verabschiedung $name";

    1. Hiho,

      ich will die entsprechenden Stellen aber nicht raus haben sondern mit drinne behalten. Das ist ja das Problem. Sie sollen drinne sein, aber nicht gezählt werden...

      Marc

  3. 你好 AllesMeins,

    folgendes Problem. Ich möchte gernen einen Text nach 150 Zeichen
    abschneiden, dabei sollen allerdings Text der von zwei Unterstrichen
    eingeschlossen ist nicht mitgezählt werden.

    Mal exemplarisch, wie man an so ein Problem herangehen kann:

    Durchlaufe den String zeichenweise und zähle mit. Triffst du auf das
    Zeichen _ und ist das darauf folgende Zeichen auch _, (1) dann höre auf zu
    zählen bis du beim nächsten _ ankommst. Ist das darauf folgende Zeichen
    auch ein _, fange wieder an zu zählen, ansonsten siehe (1). Bist du mit
    deinem Zählerstand bei 150 angekommen, gib den String-Index zurück.
    Schneide nun den String von 0 bis zum zurückgegebenen Index aus.

    Ich denke, ein so einfacher Algorithmus sollte dir keine Probleme bereiten.

    再见,
     克里斯蒂安

    --
    Neue Hardware eingebaut | Der dritte mir bekannte Block-Nutzer
    Wer sich zu überschwänglich freut, wir später Grund zum Weinen haben.
    http://wwwtech.de/
    1. Hi Christian,

      Durchlaufe den String zeichenweise und zähle mit. Triffst du auf das
      Zeichen _ und ist das darauf folgende Zeichen auch _, (1) dann höre auf zu
      zählen bis du beim nächsten _ ankommst. Ist das darauf folgende Zeichen
      auch ein _, fange wieder an zu zählen, ansonsten siehe (1). Bist du mit
      deinem Zählerstand bei 150 angekommen, gib den String-Index zurück.
      Schneide nun den String von 0 bis zum zurückgegebenen Index aus.

      Ungefähr so hab ichs ja auch gemacht - nur dass ich jedes ausgelesene Zeichen
      auch direkt rüberkopiert habe. Hat deine Methode mit dem Schneiden am Ende
      irgendwelche (Performance) Vorteile?
      Oder kommt das nur so von einem C-Programmierer, der erst wissen muss, wie
      viel Speicherplatz er für eine Variable reservieren muss, bevor er sie
      füllen kann? ;-)

      MfG, Dennis.

      --
      Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
      Die FlatBox 0.3 mit Dokumentation ist da!
      Das Leben ist kein Warenhaus - es nimmt nichts zurück. (Anette Louisan)
      1. 你好 Dennis,

        Ungefähr so hab ichs ja auch gemacht - nur dass ich jedes ausgelesene Zeichen
        auch direkt rüberkopiert habe.

        Ja, habe ich gelesen ;) Aber ich habe mit voller Absicht nochmal eine
        Anleitung geschrieben.

        Hat deine Methode mit dem Schneiden am Ende irgendwelche (Performance)
        Vorteile?

        Ja: bei meiner Methode muss nur einmal Speicher alloziiert werden ;) Bei
        deiner muss jedesmal ein neuer String erstellt werden, also jedesmal
        Speicher alloziiert werden. Das ist jedesmal ein (langsamer) System-Call.

        Oder kommt das nur so von einem C-Programmierer, der erst wissen muss, wie
        viel Speicherplatz er für eine Variable reservieren muss, bevor er sie
        füllen kann? ;-)

        Hehe, nein ;)

        再见,
         克里斯蒂安

        --
        Neue Hardware eingebaut | Der dritte mir bekannte Block-Nutzer
        <Tim> Ich bin nicht hier, um zu helfen. Mir hilft ja auch keiner. Sogar mein Brötchen muss ich mir jetzt selber schmieren.
        http://wwwtech.de/
        1. Hi Christian,

          Hat deine Methode mit dem Schneiden am Ende irgendwelche (Performance)
          Vorteile?

          Ja: bei meiner Methode muss nur einmal Speicher alloziiert werden ;) Bei
          deiner muss jedesmal ein neuer String erstellt werden, also jedesmal
          Speicher alloziiert werden. Das ist jedesmal ein (langsamer) System-Call.

          Ah - das ist einem als „PHP-Programmierer” gar nicht so bewusst, zumindest
          mir nicht - bei jeder Änderung in der Länge eines Strings muss also ein
          neuer Speicher assoziiert werden? Ok, dann ist natürlich klar, warum deine
          Methode (mehr oder weniger deutlich) performanter ist.

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Die FlatBox 0.3 mit Dokumentation ist da!
          Immer wenn man etwas anders macht, wird man wieder Leute gegen sich haben. (Jürgen Kliensmann)
    2. Hiho,

      danke für die Hinweise. Ich denk mir halt immer "Mensch, da muss es doch was einfacheres geben als das alles per Hand zu erledigen" und deshalb frage ich. Iss einfach meine angeborene Faulheit ;)

      Marc

      1. 你好 AllesMeins,

        danke für die Hinweise. Ich denk mir halt immer "Mensch, da muss es doch
        was einfacheres geben als das alles per Hand zu erledigen" und deshalb
        frage ich. Iss einfach meine angeborene Faulheit ;)

        Ich werde es nie verstehen… den Algorithmus tippt man doch in 10 Minuten,
        da würde ich mir gar nicht die Mühe machen irgendwas zu suchen, geschweige
        denn in einem Forum zu posten.

        再见,
         克里斯蒂安

        --
        (X)Emacs: buffer-cycle.el | Neue Hardware eingebaut
        Der Verstand ist der Hausherr, der Koerper sein Gast.
        http://wwwtech.de/
      2. Hallo.

        Iss einfach meine angeborene Faulheit ;)

        Faules sollte man besser nicht essen.
        MfG, at