Textausgabe nach Ganzwort beenden

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

  • Textausgabe nach Ganzwort beenden

    Hallo PHP-Gemeinde,

    ich hätte da mal wieder was, was mich verzweifeln lässt.

    Ich habe eine Newsübersich gemacht, die mir Enträge listet. Da die Einträge recht lang sein können, sollen nur die ersten paar Worte dastehen.
    Klar, mit substr() kann man den String abschneiden, aber ich will nicht mitten im Wort trennen, sondern das ganze soll dann nach dem letzten Wot abschneiden.

    Also habe ich dafür eine Funktion gebaut, ich muss dazu sagen, dass das meine erste Funktion überhaup ist. Habe sowas vorher noch nie gebraucht.

    So weit mein Script:

    Der Inhalt für $cur[content] wird per while() aus einem Array gezogen.

    ---------------------------------------------------------------------------------------------
    $text = substr($cur[content],0,72);

    function short($input){
    if (substr($input,-1) != " ") {
    $text = substr($input,0,-1);
    short($text); // Ich rufe also so lange meine Funktion auf, bis ich ein Leerzeichen als letztes habe.
    }
    }

    short($text); // Hier rufe ich die Funktion auf
    print $text."..."; // Hier soll der Text ausgegeben werden
    ---------------------------------------------------------------------------------------------

    Mit einem Eintrag in der DB funktioniert das auch wunderbar. Aber sobald ich einen zweiten drin habe, bekomme ich die Meldung
    Fatal error: Cannot redeclare short() in /homepages/....

    Hat da jeman eine Lösung, geht das vielleicht auch einfacher?

    Grüße, Andi

  • #2
    wordwrap($cur[content], 72)
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      Aber wordwrap() umbricht doch nur den String, abgeschnitten wird da nichts!
      Habe es trotzdem probiert, im Quelltext fängt er dann natürlich mit eine neuen Zeile an, aber dennoch habe ich ja den ganzen Text hintendran.

      Gruß, Andi

      Kommentar


      • #4
        $words = explode (" ", $text);

        und dann die ersten x elemente des arrays $words nehmen

        Kommentar


        • #5
          Alles gut und fein, aber zwichen den Worten "Du" und "Hubschrauberpilot" gibt es doch einen großen Unterschied.
          Meine Zeilen sollten schon in etwa gleichlang sein, dürfen aber nicht in der Zeile umbrechen. Daher muss nach ca. 70 Zeichen der Text aufhören.

          Geht doch bitte noch mal etwas näher auf meine oben beschriebene Funktion ein. Die geht ja soweit schon, nur innerhalb der while()-Schleife hat sie Probleme. Vielleicht gibts dafür eine Lösung, dann wäre alles so, wie ich mir das vorstelle.

          Dank & Gruß,
          Andi

          Kommentar


          • #6
            Denk mal mit ...
            Die Funktion wordwrap() bricht selbst an der Spalte 75 unter Verwendung des Steuerzeichens '\n' (neue Zeile) um
            ... dann reicht ein einfaches explode:
            list ($line) = explode("\n", wordwrap($string, 72))
            echo $line;
            oder:
            PHP-Code:
            $string wordwrap($string72);
            $p strpos ($string"\n");
            if (
            $p==false)
              echo 
            $string;
            else
              echo 
            substr($string0$p); 
            Wenn du möglichst nah an 72 bleiben willst statt unbedingt unter 72:
            PHP-Code:
            $laenge 72;
            list(
            $line) = explode("\n"wordwrap($string$laenge))
            # findet das erste Leerzeichen hinter Position $laenge:
            $p strpos($string' '$laenge+1);
            if (
            $p!==false && $p-$laenge <= $laenge-strlen($line))
              
            $line substr($string0$p);
            echo 
            $line
            Voraussetzung ist natürlich, dass "\n" in $string sonst nicht vorhanden ist. Ansonsten musst du dem wordwrap noch ein anderes Trennzeichen mitgeben; in jedem Fall sollte "\r\n\n\r" funktionieren.
            mein Sport: mein Frühstück: meine Arbeit:

            Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

            Kommentar


            • #7
              Danke, stimmt, so gehts es auch.

              Aber trotzdem würde mich auch noch interessieren, warum meine Funktion bei zwei Einträgen nicht funktioniert (siehe ersten Thread).
              Nur damit ich mal verstehe wie so Funktionen überhaupt funktionieren.
              Im prinzip sind die doch ähnlich im Ablauf wie JavaScript-Funktionen, wenn nicht gar genau so.

              Wäre superlieb, wenn mir da noch mal jemand eine Auskunft geben könnte.

              Es grüßt Euch der Andi

              Kommentar


              • #8
                das funktioniert exakt wie in JavaScript - darum solltest du auch etwas zurückgeben und den Rückgabewert übernehmen. Deine Funktion sähe korrekt so aus:

                PHP-Code:
                function short($input){
                  if (
                substr($input,-1) != " ")
                  {
                    
                $text substr($input,0,-1);
                    
                $text short($text);
                  }
                  return 
                $text;
                }
                # und der Aufruf:
                $text short($text);
                print 
                $text
                Allerdings ist Rekursion hier völlig fehl am Platze; eine Schleife wär besser geeignet:
                PHP-Code:
                function short($input){
                  while (
                substr($input,-1) != " ")
                    
                $input substr($input,0,-1);
                  return 
                $input;

                noch kürzer und schneller geht´s mit den php-Stringfunktionen:
                PHP-Code:
                function short($input){
                  return 
                substr($input0strrpos($input" "));

                alle drei Funktionen tun fast genau das gleiche: einen String bis zum letzten (!) Leerzeichen kürzen, wobei die letzte Version das Leerzeichen mit abschneidet.
                mein Sport: mein Frühstück: meine Arbeit:

                Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                Kommentar


                • #9
                  SUPER und 1000 Dank!!!!

                  Kommentar


                  • #10
                    ...tachchen, ich habe diesen thread mit begeisterung verfolgt,
                    da eine solche funktion natürlich eine prima sache ist und genau
                    zu meinem aktuellen problem eine lösung bietet.

                    ... aber bei mir funktioniert es leider nicht.

                    ich limitiere die anzahl der zeichen mit unten folgender funktion.
                    (die alte möglichkeit; die hier beschriebenen funktionieren leider
                    bei mir nicht, es erfolgen ebenso trennungen im ganzwort....)

                    was mache ich falsch, habe alle varianten probiert...
                    wer weis rat, vielleicht mit code in meinem quelltext?...


                    //////////////////////////////////////////////////////////////////////
                    while( $row = mysql_fetch_array ($result))
                    {
                    /////////////////////////////////////////////////////////////////////
                    // ausgabe auf 200 zeichen beschränken/////////////////
                    ////////////////////////////////////////////////////////////////////
                    $zeichen = strlen($row[text]);
                    if ($zeichen > 200) {
                    $string = substr($row["text"],0,200);
                    $row[text] = "$string";
                    }
                    $text = $row[text];
                    echo $text;
                    }
                    ////////////////////////////////////////////////////////////////////

                    Kommentar


                    • #11
                      Also Dank der Hilfe von Titus & Co. habe ich es jetzt folgendermassen gelöst:

                      print substr($text,0,strrpos(substr($text,0,70)," "));

                      Bei Dir müsste das dann also so aussehen:

                      //////////////////////////////////////////////////////////////////////
                      while( $row = mysql_fetch_array ($result))
                      {
                      /////////////////////////////////////////////////////////////////////
                      // ausgabe auf 200 zeichen beschränken/////////////////
                      /////////////////////////////////////////////////////////////////////
                      $text = $row['text'];
                      print substr($text,0,strrpos(substr($text,0,200)," "));
                      }

                      ACHTUNG:
                      Das untere Script von Titus läuft erst, wenn bei strrpos() die Leerstellen zwischen den Kommas entfernt wurden

                      Gruß, Andi
                      Zuletzt geändert von andik2000; 21.08.2002, 18:40.

                      Kommentar


                      • #12
                        Um das ganze nochmal zu verdeutlichen:

                        $text = substr($text,0,200); // Text wird nach 200 zeichen abgeschnitten
                        $tx = strrpos($text," "); // Die Position des letzten " " von rechts wir ermittelt
                        $text = substr($text,0,$tx) // Der Text wir dann an Position $tx beendent

                        print $text."..."; // fügt dann drei Punkte an deinen Text :-)


                        Gruß, der Andi (langsam check ich PHP )
                        Zuletzt geändert von andik2000; 21.08.2002, 17:02.

                        Kommentar


                        • #13
                          very nice...
                          hey danke an euch für diese coole funktion!
                          thx for the explanation. now i understand!!
                          ...
                          ..
                          .
                          mfg, crisdoe

                          Kommentar


                          • #14
                            Original geschrieben von andik2000
                            ACHTUNG:
                            Das untere Script von Titus läuft erst, wenn bei strrpos() die Leerstellen zwischen den Kommas entfernt wurden
                            also neee ... das halt ich für´n Gerücht!
                            mein Sport: mein Frühstück: meine Arbeit:

                            Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                            Kommentar


                            • #15
                              Ei ich habs doch ausprobiert.
                              Erst ging nix, dann habe ich in Deinem Script bei substr() die Leerzeichen entfernt, hat nix gebracht, dann habe ich die bei strrpos() rausgeschmissen und schon liefs!
                              Liegt vielleicht daran was fpr eine PHP-Version läuft und wie der Server konfiguriert ist.

                              Habe eben zum Spass mal in dem Script wieder die Leerzeichen reingemacht, da bringt er mir wieder nen Parser-Error ?!?

                              Muss also doch was dran sein ;-)


                              Grüße, Andi

                              Kommentar

                              Lädt...
                              X