Metehan: php-Funktion wordwrap()

        } elseif (strlen(html_entity_decode($ShoutPart, ENT_QUOTES)) > 21) {  
            $ShoutNew[$i] = htmlspecialchars(wordwrap(html_entity_decode($ShoutPart, ENT_QUOTES), 21, " ", 1), ENT_QUOTES);

Wer kann mir bitte genau beschreiben, wie die Codezeile genau zu interpretieren ist.

Die Funktion wordwrap() ja einen String nach einer bestimmten Anzahl Zeichen umbricht. Was ich nicht nachvollziehen kann ist, dass diese Funktion die Zeichen nicht umbricht, sondern ab 21 Zeichen eine Leerzeile einfügt.

Also aus Verbesserungsvorschläge wird Verbesserungsvorschlä ge.

Reicht es aus, die beiden Werte "21" einfach höher zu setzen, z.B. auf 50? Oder ist es besser, die Codezeile abzuändern. Wenn ja, wie?

Danke.

  1. Hallo,

    } elseif (strlen(html_entity_decode($ShoutPart, ENT_QUOTES)) > 21) {

    $ShoutNew[$i] = htmlspecialchars(wordwrap(html_entity_decode($ShoutPart, ENT_QUOTES), 21, " ", 1), ENT_QUOTES);

      
    
    > Wer kann mir bitte genau beschreiben, wie die Codezeile genau zu interpretieren ist.  
      
    für den Anfang könntest du die Bedeutung und Arbeitsweise der verwendeten Funktionen im [PHP-Manual](http://www.php.net/) nachlesen.  
      
    
    > Die Funktion wordwrap() ja einen String nach einer bestimmten Anzahl Zeichen umbricht.  
      
    Kommt drauf an, was du unter "umbrechen" verstehst.  
      
    
    > Was ich nicht nachvollziehen kann ist, dass diese Funktion die Zeichen nicht umbricht, sondern ab 21 Zeichen eine Leerzeile einfügt.  
      
    Die [Beschreibung](http://de3.php.net/manual/en/function.wordwrap.php) verrät uns, dass der zweite Parameter die maximale Länge der Teilstücke angibt, und der dritte Parameter (falls er angegeben ist) das Zeichen bzw. die Zeichen, die als Trennfuge eingefügt wird.  
      
    
    > Also aus Verbesserungsvorschläge wird Verbesserungsvorschlä ge.  
      
    Richtig, weil als Trennfuge ein " " übergeben wird. Wenn du dort stattdessen einen Zeilenumbruch willst, musst du das auch so angeben - oder diesen Parameter und den folgenden vierten ganz weglassen, da sie optional sind und du anscheinend mit den Defaultwerten glücklich wirst.  
    Überhaupt erscheint mir die Angabe von " " als Trennzeichen ziemlich sinnlos, da wordwrap() den String an Leerzeichen trennt - wo liegt der Sinn, genau dort wieder ein Leerzeichen einzusetzen, wo vorher ein Leerzeichen war? Letztendlich bekommst du deinen String so unverändert wieder zurück.  
      
    
    > Reicht es aus, die beiden Werte "21" einfach höher zu setzen, z.B. auf 50? Oder ist es besser, die Codezeile abzuändern. Wenn ja, wie?  
      
    Was meinst du, nachdem du die Beschreibung im Manual gelesen hast?  
      
    So long,  
     Martin  
    
    -- 
    Eine Nonne kommt in den Himmel. An der Pforte fragt Petrus: "Wer bist du?" - "Ich bin die Braut Jesu." Petrus stutzt einen Moment, ruft dann nach hinten: "He Freunde, habt ihr schon gehört? Der Juniorchef will heiraten!"  
    
    
    1. Danke für die wirklich guten Lösungsansätze. Eine vollumfängliche Interpretation und Umsetzung wird aber für mich einige Zeit in Anspruch nehmen. Daher wäre ich schon verbunden, zumindest für diese Problemstellung eine Optimierung vorgeschlagen zu bekommen, sofern nicht zuviel verlangt. Ansonsten trotzdem vielen Dank. nachfolgend der kompl. Codeabschnitt.

                  // email encoding to stop harvesters  
                  $ShoutPart = bin2hex($ShoutPart);  
                  $ShoutPart = chunk_split($ShoutPart, 2, '%');  
                  $ShoutPart = '%' . substr($ShoutPart, 0, strlen($ShoutPart) - 1);  
                  $ShoutNew[$i] = "&#91;<a href=\"mailto:$ShoutPart\">E-Mail</a>&#93;";  
              } elseif ((eregi("\.(us|tv|cc|ws|ca|de|jp|ro|be|fm|ms|tc|ph|dk|st|ac|gs|vg|sh|kz|as|lt|to)", substr("$ShoutPart", -3, 3))) OR (eregi("\.(com|net|org|mil|gov|biz|pro|xxx)", substr("$ShoutPart", -4, 4))) OR (eregi("\.(info|name|mobi)", substr("$ShoutPart", -5, 5))) OR (eregi("\.(co\.uk|co\.za|co\.nz|co\.il)", substr("$ShoutPart", -6, 6)))) {  
                  if ($conf['urlonoff'] == "no") {  
                      $ShoutError = _URLNOTALLOWED;  
                      return false;  
                  }  
                  $ShoutPart = "http://" . $ShoutPart;  
                  $ShoutNew[$i] = "&#91;<a rel=\"nofollow\" target=\"_blank\" href=\"$ShoutPart\">URL</a>&#93;";  
              } elseif (strlen(html_entity_decode($ShoutPart, ENT_QUOTES)) > 21) {  
                  $ShoutNew[$i] = htmlspecialchars(wordwrap(html_entity_decode($ShoutPart, ENT_QUOTES), 21, " ", 1), ENT_QUOTES);  
        
                  $ShoutNew[$i] = str_replace("[ b]", " [b]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[b ]", " [b]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[ /b]", "[/b] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/ b]", "[/b] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/b ]", "[/b] ", $ShoutNew[$i]);  
        
                  $ShoutNew[$i] = str_replace("[ i]", " [i]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[i ]", " [i]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[ /i]", "[/i] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/ i]", "[/i] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/i ]", "[/i] ", $ShoutNew[$i]);  
        
                  $ShoutNew[$i] = str_replace("[ u]", " [u]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[u ]", " [u]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[ /u]", "[/u] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/ u]", "[/u] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/u ]", "[/u] ", $ShoutNew[$i]);  
              } else {  
                  $ShoutNew[$i] = $ShoutPart;  
              }  
              $i++;  
          }
      
    2. oder diesen Parameter und den folgenden vierten ganz weglassen, da sie optional sind und du anscheinend mit den Defaultwerten glücklich wirst.
      Überhaupt erscheint mir die Angabe von " " als Trennzeichen ziemlich sinnlos, da wordwrap() den String an Leerzeichen trennt - wo liegt der Sinn, genau dort wieder ein Leerzeichen einzusetzen, wo vorher ein Leerzeichen war? Letztendlich bekommst du deinen String so unverändert wieder zurück.

      Wie sehe dann in diesem Fall die neue Codezeile aus?

               } elseif (strlen(html_entity_decode($ShoutPart, ENT_QUOTES)) > 21) {  
      
      >             $ShoutNew[$i] = htmlspecialchars(wordwrap(html_entity_decode($ShoutPart, ENT_QUOTES), 21, " ", 1), ENT_QUOTES);
      
      
  2. Hello,

    } elseif (strlen(html_entity_decode($ShoutPart, ENT_QUOTES)) > 21) {

    $ShoutNew[$i] = htmlspecialchars(wordwrap(html_entity_decode($ShoutPart, ENT_QUOTES), 21, " ", 1), ENT_QUOTES);

    
    >   
    > Wer kann mir bitte genau beschreiben, wie die Codezeile genau zu interpretieren ist.  
    >   
    > Die Funktion wordwrap() ja einen String nach einer bestimmten Anzahl Zeichen umbricht. Was ich nicht nachvollziehen kann ist, dass diese Funktion die Zeichen nicht umbricht, sondern ab 21 Zeichen eine Leerzeile einfügt.  
    >   
    > Also aus Verbesserungsvorschläge wird Verbesserungsvorschlä ge.  
      
    Hier wird mit Codierungen bzw. HTML-Entitäten herumgespielt...  
      
    Zu beachten wäre außerdem, dass Wordwrap keine Zeichenketten im Allgemeinen, sondern nur single-byte-codierte Zeichenketten umbricht.  
      
      
    Schau Dir die Doku an zu den verwendeten Funktionen  
      
    <http://de2.php.net/manual/en/function.html-entity-decode.php>  
    <http://de2.php.net/manual/ene/function.wordwrap.php>  
    <http://de2.php.net/manual/en/function.htmlspecialchars.php>  
    <http://de2.php.net/manual/en/function.strlen.php>  
      
    und prüfe Deine Website, wie sie codiert ist. Wenn sie z.B. in UTF-8 codiert ist, kannst du mit dem Code gar nichts mehr anfangen.  
      
    Außerdem würde ich hier ernsthaft zur expliziten Schreibweise raten, sodass html\_entity\_decode($ShoutPart, ENT\_QUOTES)  
    nicht zweimal berechnet werden muss...  
      
      
      
      
      
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
     ☻\_  
    /▌  
    / \ Nur selber lernen macht schlau  
    <http://bergpost.annerschbarrich.de>
    
    1. Danke für die wirklich guten Lösungsansätze. Eine vollumfängliche Interpretation und Umsetzung wird aber für mich einige Zeit in Anspruch nehmen. Daher wäre ich schon verbunden, zumindest für diese Problemstellung eine Optimierung vorgeschlagen zu bekommen, sofern nicht zuviel verlangt. Ansonsten trotzdem vielen Dank. nachfolgend der kompl. Codeabschnitt.

                  // email encoding to stop harvesters  
                  $ShoutPart = bin2hex($ShoutPart);  
                  $ShoutPart = chunk_split($ShoutPart, 2, '%');  
                  $ShoutPart = '%' . substr($ShoutPart, 0, strlen($ShoutPart) - 1);  
                  $ShoutNew[$i] = "&#91;<a href=\"mailto:$ShoutPart\">E-Mail</a>&#93;";  
              } elseif ((eregi("\.(us|tv|cc|ws|ca|de|jp|ro|be|fm|ms|tc|ph|dk|st|ac|gs|vg|sh|kz|as|lt|to)", substr("$ShoutPart", -3, 3))) OR (eregi("\.(com|net|org|mil|gov|biz|pro|xxx)", substr("$ShoutPart", -4, 4))) OR (eregi("\.(info|name|mobi)", substr("$ShoutPart", -5, 5))) OR (eregi("\.(co\.uk|co\.za|co\.nz|co\.il)", substr("$ShoutPart", -6, 6)))) {  
                  if ($conf['urlonoff'] == "no") {  
                      $ShoutError = _URLNOTALLOWED;  
                      return false;  
                  }  
                  $ShoutPart = "http://" . $ShoutPart;  
                  $ShoutNew[$i] = "&#91;<a rel=\"nofollow\" target=\"_blank\" href=\"$ShoutPart\">URL</a>&#93;";  
              } elseif (strlen(html_entity_decode($ShoutPart, ENT_QUOTES)) > 21) {  
                  $ShoutNew[$i] = htmlspecialchars(wordwrap(html_entity_decode($ShoutPart, ENT_QUOTES), 21, " ", 1), ENT_QUOTES);  
        
                  $ShoutNew[$i] = str_replace("[ b]", " [b]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[b ]", " [b]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[ /b]", "[/b] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/ b]", "[/b] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/b ]", "[/b] ", $ShoutNew[$i]);  
        
                  $ShoutNew[$i] = str_replace("[ i]", " [i]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[i ]", " [i]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[ /i]", "[/i] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/ i]", "[/i] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/i ]", "[/i] ", $ShoutNew[$i]);  
        
                  $ShoutNew[$i] = str_replace("[ u]", " [u]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[u ]", " [u]", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[ /u]", "[/u] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/ u]", "[/u] ", $ShoutNew[$i]);  
                  $ShoutNew[$i] = str_replace("[/u ]", "[/u] ", $ShoutNew[$i]);  
              } else {  
                  $ShoutNew[$i] = $ShoutPart;  
              }  
              $i++;  
          }
      
      1. Liebe(r) Metehan,

        Eine vollumfängliche Interpretation und Umsetzung wird aber für mich einige Zeit in Anspruch nehmen. Daher wäre ich schon verbunden, zumindest für diese Problemstellung eine Optimierung vorgeschlagen zu bekommen, sofern nicht zuviel verlangt.

        heißt das, Du willst hier Zeit sparen, indem andere Dein Problem lösen sollen? Wenn Du Dir die notwendige Zeit nicht nehmen willst, dann kann Dein Anliegen nicht wirklich so wichtig sein.

        $ShoutNew[$i] = str_replace("[ b]", " [b]", $ShoutNew[$i]);

        $ShoutNew[$i] = str_replace("[b ]", " [b]", $ShoutNew[$i]);
                    $ShoutNew[$i] = str_replace("[ /b]", "[/b] ", $ShoutNew[$i]);
                    $ShoutNew[$i] = str_replace("[/ b]", "[/b] ", $ShoutNew[$i]);
                    $ShoutNew[$i] = str_replace("[/b ]", "[/b] ", $ShoutNew[$i]);

        $ShoutNew[$i] = str_replace("[ i]", " [i]", $ShoutNew[$i]);
                    $ShoutNew[$i] = str_replace("[i ]", " [i]", $ShoutNew[$i]);
                    $ShoutNew[$i] = str_replace("[ /i]", "[/i] ", $ShoutNew[$i]);
                    $ShoutNew[$i] = str_replace("[/ i]", "[/i] ", $ShoutNew[$i]);
                    $ShoutNew[$i] = str_replace("[/i ]", "[/i] ", $ShoutNew[$i]);

        $ShoutNew[$i] = str_replace("[ u]", " [u]", $ShoutNew[$i]);
                    $ShoutNew[$i] = str_replace("[u ]", " [u]", $ShoutNew[$i]);
                    $ShoutNew[$i] = str_replace("[ /u]", "[/u] ", $ShoutNew[$i]);
                    $ShoutNew[$i] = str_replace("[/ u]", "[/u] ", $ShoutNew[$i]);
                    $ShoutNew[$i] = str_replace("[/u ]", "[/u] ", $ShoutNew[$i]);

          
        Dafür bieten sich reguläre Ausdrücke an, damit Du solche Stringmanipulationen mit einer einzigen Code-Zeile erledigen kannst. Näheres dazu im PHP-Manual: [preg_replace()](http://de2.php.net/manual/en/function.preg-replace.php)  
          
        `$ShoutNew[$i] = preg_replace('~(?s)\[ ?(/)? ?([biu]) ?\]~', '[$1$2]', $ShoutNew[$i]);`{:.language-php}  
          
        Ich würde auch das Wordwrapping völlig anders lösen. Warum sollte man sich auch zu schade sein, das manuell auszuprogrammieren? Man definiert eine Maximallänge, schneidet den String nach dieser ab, findet vom Ergebnisstring das letzte Leerzeichen, kürzt bis zu dessen Position und ergänzt am Ende eine Ellipse (die drei Punkte).  
          
        Liebe Grüße,  
          
        Felix Riesterer.
        
        -- 
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)