Wordwrap auf einen HTML Text anwenden

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

  • Wordwrap auf einen HTML Text anwenden

    Hi Leute,

    ein weiteres, riesenproblem. Ich habe in einer Variable einen HTML text mit einigen links drin (keine <br>'s und auch keine tabellen oder sowas, nur links). Nun soll dieser Text in einem Gästebuch ausgegeben werden, allerdings will ich dafür sorgen daß das Gästebuch IMMER eine bestimmte Breite hat. Nun kann ich mir aber vorstellen daß Leute gerne extralange Wörter wie "blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla blablablablablablablabla" benutzen werden, um das schöne Gästebuch zu verunstalten. Deswegen suche ich nach einer Wordwrap Funktion.

    Die Wordwrap funktion von PHP kann ich aber nicht verwenden weil sie die HTML tags der Links auseinandersetzen würde. Ich will die nicht nur behalten, ich will auch noch daß sie vollkommen ignoriert werden, als wären sie nicht da (was dann auch später im Browser ja auch der fall ist).

    UND als extra Bonus: sie darf HTML Sonderzeichen wie "&uum" für "ü"auch nicht auseinanderschnipseln.

    Ich habe schon 2 gefunden ("WordWrap2" und "Sheep_WordWrap") aber sie haben nicht zum erwünschten Resultat geführt.

    SOS

    ceeu

    Krystman

  • #2
    willst du jetzt nur ganze Wörter haben oder eine ganz feste Breite, so dass auch mitten im Wort abgeschnitten wird? Sorry, wird mir nicht ganz klar aus deiner Beschreibung. Zuerst ja, aber dann das mit dem Nicht-Trennen von "&uum" usw. ...

    Kommentar


    • #3
      Axo, ja.. also ich will einfach daß wörter über einer bestimmten länge geteilt werden aber daß html tags und alles was dzugehört ganz bleibt.

      Kommentar


      • #4
        hmm

        sorry, heute habe ich leider keine Zeit mehr. Melde mich dann morgen früh wieder...

        Kommentar


        • #5
          wenn Du davon ausgehst dass blanks zwischen den Worten sind dann nimm das hier:
          // das nimmt die ersten 150 Zeichen
          $txt = substr($voll_text,0,150);
          // ermittelt die Position des letzten blank im kurzen String
          $pos = strrpos($txt," ");
          // nimmt den kurzen String bis zum letzten blank
          $txt = substr($txt,0,$pos);
          Beantworte nie Threads mit mehr als 15 followups...
          Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

          Kommentar


          • #6
            Mello, das ist zwar eine einfache Methode aber sie erfüllt die Voraussetzungen nicht. Eine Word Wrap Funktion, die ich meine würde

            a. Zu lange wörter auseinanderschneiden. Tut deine Funktion nicht, denn strrpos gibt 0 aus wenn der gesuchte string nicht gefunden wurde (also wenn kein leerzeichen im ursprünglichen $txt ist). Dann ist der gewrappte $txt ="". Nicht schlimm, könnte man ja leicht fixen aber:

            b. HTML Tags unagetastet lassen was deine Funktion GAR NICHT berücksichtigt

            Ich glaube ich habe einen Code gefunden, der mir helfen könnte, muß aber noch daran herumschrauben. Postet mal weiter falls ihr noch ne idee habt, ich sag' euch bescheid wenn bei mir was rausgekommen ist. Nun habe ich heute keine Zeit mehr...

            ceeu

            Krytsman

            Kommentar


            • #7
              ok wer lesen kann is klar im Vorteil... :-)

              lange Worte könntest Du "brechen" wenn Du sowas machst:

              if(strrpos($txt," ")>$max_zeichen){
              str_replace (substr($txt,0,$max_zeichen),substr($txt,0,$max_zeichen)." ",$txt)
              }
              Dann noch die HTML tags ausklammern und das sollte gehen...
              Beantworte nie Threads mit mehr als 15 followups...
              Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

              Kommentar


              • #8
                hmmm

                zur Vorgehensweise:
                ich würde, glaube ich, erstmal den gesamten Text mittels Leerzeichen exploden und dann in einer Schleife, die solange läuft, bis der Maximalwert/-länge überschritten oder erreicht ist, immer prüfen, was als nächstes Fragment drangepappt werden soll -> wenn klar, daß das nächste Fragment die gewünschte Länge vervollständigt, dann schauen, ob ein HTML-Tag oder Umlaut an der zu schneidenden Stelle ist.

                Oder poste doch mal den Code, den du gefunden hast, wenn du meinst, daß dieser besser ist.

                Kommentar


                • #9
                  Ok also das ist hier die Fuktion. Ich habe sie ein wenig debuggt, es waren zweil kleine Fehler drin. Der Author kam durcheinander mit den poistionen innerhalb der strings - der erste Buchstabe ist der buchstabe nr. 0 und nicht nr. 1
                  Ganz cool an der Funktion ist daß sie unproportionale Schriftarten berücksichtigen kann. Ein W ist beispielsweise breiter als ein I. Deswegen 'zählt' ein W mehr als ein I. Ist aber Optional.

                  Im Prinzip durchläuft die Funktion den String buchstabenweise und zählt die buchstaben seit dem letzen leerzeichen oder zeilenumbruch. Ab einer bestimmten länge fügt sie die umbruchstrings ($cut) ein. Man kann die exclude zeichen definieren, welche den zähler ausstellen bis ein ein exclude2 zeichen den zähler wieder anstellt. So werden eben die HTML tags übersprungen.

                  "Wordwrap nonproportional fonts! and exclude html tags!

                  If you have a problem with PHP' worwrap which you aren't able to give
                  arguments for NOT parsing through some string parts (like html codes,
                  which could be longer then ie.80 chars), here's how to do it.

                  This function, cuts words in $str longer then $cols long, and puts and
                  $cut in
                  it. It escapes everything whitin "<>".
                  So "<longggggggggggggtext>" will not be cutted, and just
                  "longggggggggggggtext", will be cutted!

                  This one can also try to work with nonproportional fonts. Like Arial and
                  Verdana, instead of only fixed fonts.

                  $str = the string you want to process.
                  $cols = choose ie.80 for prop.fonts
                  choose ie.450 for non prop fonts
                  NOTE: $cols are not pixels!
                  $non_prop = choose "true" for arial,verdana etc.
                  false = fixed (courier)
                  $cut = is appended at the end of the last chunk if and only if
                  that last chunk is of length $width.
                  $exclude1 = excludesystem, read the begin of this note. enter '<'
                  $exclude2 = enter '>'
                  PHP-Code:
                  <?php
                  function sheep_wordwrap($str,$cols,$non_prop,$cut,$exclude1,$exclude2){
                    
                  $count=0;
                    
                  $tagcount=0;
                    
                  $str_len=strlen($str);
                    
                  //$cut=" $cut ";
                    
                  $calcwidth=0;
                    
                    for (
                  $i=0$i<=$str_len;$i++){
                      
                  $str_len=strlen($str);
                      if (
                  $str[$i]==$exclude1)
                        
                  $tagcount++;
                      elseif (
                  $str[$i]==$exclude2){
                        if (
                  $tagcount>0)
                          
                  $tagcount--;
                      }
                      else{
                        if ((
                  $tagcount==0)){
                          if ((
                  $str[$i]==' ') || ($str[$i]=="\n"))
                            
                  $calcwidth=0;
                          else{
                            if (
                  $non_prop){
                              if (
                  ereg("([QWOSDGCM#@m%w]+)",$str[$i],$matches))
                                
                  $calcwidth=$calcwidth+7;
                              elseif
                  (
                  ereg("([I?\|()\"]+)",$str[$i],$matches))
                                
                  $calcwidth=$calcwidth+4;
                              elseif (
                  ereg("([i']+)",$str[$i],$matches))
                                
                  $calcwidth=$calcwidth+2;
                              elseif (
                  ereg("([!]+)",$str[$i],$matches))
                                
                  $calcwidth=$calcwidth+3;
                              else{
                                
                  $calcwidth=$calcwidth+5;
                              }
                            }
                            else{
                              
                  $calcwidth++;
                            }
                            if (
                  $calcwidth>$cols){
                              
                  $str=substr($str,0,$i-1).$cut.substr($str,$i-1,$str_len-1);
                              
                  $calcwidth=0;
                            }
                          }
                        }
                      }
                    }
                    return 
                  $str;
                    
                  //moby rules at 5am! :) -Ivan
                   // Das stimmt allerdings, und nicht nur dann -Krystman
                  }

                  ?>
                  "
                  Nun muß man noch dafür sorgen daß die Spezialzeichen nicht getrennt werden. Im Prinzip sucht man einfach nach einem & zeichen und wenn einer kommt überspringt man die nächsten 3 oder?

                  ceeu

                  Krystman

                  EDIT: Hab mal die Funktion zur besseren Darstellung als Code dargestellt.
                  Zuletzt geändert von BrainBug; 09.04.2002, 17:57.

                  Kommentar


                  • #10
                    ja, stimmt. Allerdings mußt du beachten, daß ein HTML-Zeichen auch drei oder vier Zeichen nach dem & haben kann -> reg; (drei Zeichen) oder uuml; (vier Zeichen) -> allerdings sollte HTML-standardgemäß auch ein Semikolon den Abschluß bilden (IE ist da ja sehr großzügig). Naja, am besten, du packst alle möglichen in ein Array und guckst, wenn da ein & auftaucht, ob ein Semikolon nach 2-5 Zeichen kommt, wenn ja, dann fix in Array nachgeschaut mittels der funktion in_array() und fertig.

                    Kommentar

                    Lädt...
                    X