PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Extensii referitoare la variabile şi tipuri> <String Funcţii
Last updated: Fri, 02 May 2008

view this page in

wordwrap

(PHP 4 >= 4.0.2, PHP 5)

wordwrap — Wraps a string to a given number of characters

Descrierea

string wordwrap ( string $str [, int $width [, string $break [, bool $cut ]]] )

Wraps a string to a given number of characters using a string break character.

Parametri

str

The input string.

width

The column width. Defaults to 75.

break

The line is broken using the optional break parameter. Defaults to '\n'.

cut

If the cut is set to TRUE, the string is always wrapped at the specified width. So if you have a word that is larger than the given width, it is broken apart. (See second example).

Valorile întroarse

Returns the given string wrapped at the specified column.

Istoria schimbărilor

Versiunea Descriere
4.0.3 The optional cut parameter was added.

Exemple

Example #1 wordwrap() example

<?php
$text 
"The quick brown fox jumped over the lazy dog.";
$newtext wordwrap($text20"<br />\n");

echo 
$newtext;
?>

Exemplul de mai sus va afişa:

The quick brown fox<br />
jumped over the lazy<br />
dog.

Example #2 wordwrap() example

<?php
$text 
"A very long woooooooooooord.";
$newtext wordwrap($text8"\n"true);

echo 
"$newtext\n";
?>

Exemplul de mai sus va afişa:

A very
long
wooooooo
ooooord.

Vedeţi de asemenea



add a note add a note User Contributed Notes
wordwrap
admin at jcink dot com
25-Apr-2008 01:56
I wanted something that would word wrap just one word. People were doing ffffffffffffffffff in my comments page on my site, annoyingly stretching the page. but I didn't want to wrap at a certain fixed length, just wanted to break up words like that only. Here's what I came up with if anyone wants it.

function one_wordwrap($string,$width){
$s=explode(" ", $string);
foreach ($s as $k=>$v) {
$cnt=strlen($v);
if($cnt>$width) $v=wordwrap($v, $width, "<br />", true);
$new_string.="$v ";
}
return $new_string;
}
ivan dot chura at gmail dot com
21-Apr-2008 05:40
This function can be useful for wrap string by specify chars, not only space char.

<?php

   
/**
     * Wrap string by specify chars
     *
     * @param string $strForWrap
     * @param integer $maxLength
     * @param string $breakChar
     * @param array $wrapChars
     *
     * @author Ivan Chura
     * @since 21.04.2008
     * @return string
    **/
   
   
function wordwrapBySpecifyChars($strForWrap, $maxLength = 80, $breakChar = "\n", $wrapChars = array(",", ";" ))
        {
       
$newStr = null;
       
$length_of_string = strlen($strForWrap);
       
        if (
$length_of_string <= $maxLength)
            {
            return
$strForWrap;
            }
           
       
$count_of_string = 1;   
       
$wait_new_line = false;
       
        for(
$i=0; $i<$length_of_string; $i++)
            {
            if (
$count_of_string*$maxLength == $i || $wait_new_line)
                {
               
                if (
in_array($strForWrap{$i}, $wrapChars ) )
                    {
                   
$count_of_string ++;
                    
                   
$newStr .= $strForWrap{$i}.$breakChar;
                   
$wait_new_line = false;
                    }
                else
                    {
                   
$newStr .= $strForWrap{$i};
                   
$wait_new_line = true;
                    }
                }
            else
                {
               
$newStr .= $strForWrap{$i};  
                }
            
            }
           
        return
$newStr;
        }
?>
$del=&#39; at &#39;; &#39;sanneschaap&#39; dot $del dot &#39;gmail dot com&#39;
17-Apr-2008 01:41
These functions let you wrap strings comparing to their actual displaying width of proportional font. In this case Arial, 11px. Very handy in some cases since CSS3 is not yet completely supported. 100 strings = ~5 ms

My old sheep word wrap function (posted at the bottom of this page, is kinda old dated and this one is faster and more accurate).

//the width of the biggest char @
$fontwidth = 11;

//each chargroup has char-ords that have the same proportional displaying width
$chargroup[0] = array(64);
$chargroup[1] = array(37,87,119);
$chargroup[2] = array(65,71,77,79,81,86,89,109);
$chargroup[3] = array(38,66,67,68,72,75,78,82,83,85,88,90);
$chargroup[4] = array(35,36,43,48,49,50,51,52,53,54,55,56,57,60,61,62,63, 69,70,76,80,84,95,97,98,99,100,101,103,104,110,111,112, 113,115,117,118,120,121,122,126);
$chargroup[5] = array(74,94,107);
$chargroup[6] = array(34,40,41,42,45,96,102,114,123,125);
$chargroup[7] = array(44,46,47,58,59,91,92,93,116);
$chargroup[8] = array(33,39,73,105,106,108,124);
   
//how the displaying width are compared to the biggest char width
$chargroup_relwidth[0] = 1; //is char @
$chargroup_relwidth[1] = 0.909413854;
$chargroup_relwidth[2] = 0.728241563;
$chargroup_relwidth[3] = 0.637655417;
$chargroup_relwidth[4] = 0.547069272;
$chargroup_relwidth[5] = 0.456483126;
$chargroup_relwidth[6] = 0.36589698;
$chargroup_relwidth[7] = 0.275310835;
$chargroup_relwidth[8] = 0.184724689;

//build fast array
$char_relwidth = null;
for ($i=0;$i<count($chargroup);$i++){
    for ($j=0;$j<count($chargroup[$i]);$j++){
        $char_relwidth[$chargroup[$i][$j]] = $chargroup_relwidth[$i];
    }
}

//get the display width (in pixels) of a string
function get_str_width($str){
    global $fontwidth,$char_relwidth;
    $result = 0;
    for ($i=0;$i<strlen($str);$i++){
        $result += $char_relwidth[ord($str[$i])];
    }
    $result = $result * $fontwidth;
    return $result;   
}

//truncates a string at a certain displaying pixel width
function truncate_str_at_width($str, $width, $trunstr='...'){
    global $fontwidth,$char_relwidth;       
    $trunstr_width = get_str_width($trunstr);
    $width -= $trunstr_width;
    $width = $width/$fontwidth;
    $w = 0;
    for ($i=0;$i<strlen($str);$i++){
        $w += $char_relwidth[ord($str[$i])];
        if ($w > $width)
            break;   
    }
    $result = substr($str,0,$i).$trunstr;
    return $result;
    // texas is the reason rules at 10am :)
}
joachim
16-Apr-2008 02:42
There seems to be a difference between php 5.1 and 5.2 in how wordwrap counts characters (all on Mac OSX 10.5.2):

/Applications/MAMP/bin/php5/bin/php --version
PHP 5.1.6 (cli) (built: Sep  8 2006 10:25:04)

/Applications/MAMP/bin/php5/bin/php -r 'echo wordwrap("In aller Freundschaft (50)_UT", 20) . "\n";'
In aller
Freundschaft
(50)_UT

php --version
PHP 5.2.5 (cli) (built: Feb 20 2008 12:30:47)

php -r 'echo wordwrap("In aller Freundschaft (50)_UT", 20) . "\n";'
In aller
Freundschaft (50)_UT
lqvang_NoSpamHere_79 at gmail dot com
09-Apr-2008 02:05
@znupiDONTWANTSPAM69 at gmail dot comBLAH

the layout_wrap function doesn't work as I expected. Following is my version. It may consume more resource but gives solid result:

<?php
function longword_break($str, $i) {

   if ((empty(
$str))||(strlen($str)<$i)){
   return
$str;
   }
  
$words_arr = explode(' ', $str);
   foreach (
$words_arr as &$word){
    
$br_word = explode("\n", $word);
       
//Process some run-in words conected by "\n"
       
foreach ($br_word as &$r_word){
         
$j=$i;
    
             while(
$j < strlen($r_word)) {

               
$r_word = substr($r_word, 0, $j) . ' '. substr($r_word, $j);

               
$j+= ($i +1);
            }
        }
       
$word =implode("\n", $br_word);
        unset(
$r_word);           
    }
    unset(
$word);
   
$str = implode(' ',$words_arr);
  

   
//return  nl2br(wordwrap($str, $i,"\n", true));
    //return  nl2br($str);
   
return  $str;

}
// Some test:
$str = "This is 0123456789
aaaaaa ttttttttttttttttttttt
ccc gggggggggg"
;
$str1 = "aaaaaaaaaaatessssssssssssssssstxxx";
echo
"Orgininal string:<br />" . $str . "<br />";
echo
"Layout wrap function: <br />" . layout_wrap($str,5). "<br />";
echo
"Long word break function: <br/>" . longword_break($str,5). "<br />";

?>
Output:
Orgininal string:
This is 0123456789 aaaaaa ttttttttttttttttttttt ccc gggggggggg
Layout wrap function:
This is 0123456 789 aaaaaa ttttttt tttt tttt tttt tt ccc ggggggg ggg
<!--Notice some "words" are still longer than 5 characters. /-->
Long word break function:
This is 01234 56789 aaaaa a ttttt ttttt ttttt ttttt t ccc ggggg ggggg
robert at codehelpers dot com
04-Apr-2008 09:15
When using wordwrap() on a long word (an English word), It's best to use "-\n" as the '$string break' argument. Why? Because when you're forcing a cut (as bool TRUE), proper English is to include the hyphen to let the reader know that a certain word is being continued on the next line. A good example would be like: http://www.codehelpers.com/Worlds%20Longest%20English%20Word.php

<?php
echo wordwrap($word, 100, "-\n", true);
?>
znupiDONTWANTSPAM69 at gmail dot comBLAH
24-Feb-2008 08:05
If you are dealing with strings that may be very long and without spaces, but at the same time may be very long WITH spaces and you don't want the ones without spaces ruining your HTML+CSS layout, here's a function that adds a space (" ") after every $i characters, if no space is found until that character, so the browser will automatically wrap the text:

<?php

function layout_wrap($str, $i) {
   
$j = $i;
    while (
$i < strlen($str)) {
        if (
strpos($str, ' ', $i-$j+1) > $i+$j || strpos($str, ' ', $i-$j+1) === false) {
           
$str = substr($str, 0, $i) . ' ' . substr($str, $i);
        }
       
$i += $j;
    }
    return
$str;
}

?>

Hope this helps someone :-)
thomas at tgohome dot com
19-Feb-2008 12:21
I wrote a justification function for a project of mine. It uses the wordwrap function and provides four justification options:

* Left; typically, the leftmost words receive the most padding
* Right; vice versa; the rightmost words receive the most padding
* Both; tries to evenly distribute the padding among leftmost and rightmost words
* Average; most complicated, uses an average of the three previous algorithms. I'd say this one produces the best result as it's more distributed in the center.

It does not justify the last line.

<?php
define
('JPAD_LEFT', 1);     // More spaces are added on the left of the line
define('JPAD_RIGHT', 2);    // More spaces are added on the right of the line
define('JPAD_BOTH', 4);     // Tries to evenly distribute the padding
define('JPAD_AVERAGE', 8);  // Tries to position based on a mix of the three algorithms

function justify($input, $width, $mode = JPAD_AVERAGE)
{
   
// We want to have n characters wide of text per line.
    // Use PHP's wordwrap feature to give us a rough estimate.
   
$justified = wordwrap($input, $width, "\n", false);
   
$justified = explode("\n", $justified);
   
   
// Check each line is the required width. If not, pad
    // it with spaces between words.
   
foreach($justified as $line)
    {
        if(
strlen($line) != $width)
        {
           
// Split by word, then glue together
           
$words = explode(' ', $line);
           
$diff  = $width - strlen($line);
           
            while(
$diff > 0)
            {   
               
// Process the word at this diff
               
if     ($mode == JPAD_BOTH$words[$diff / count($words)] .= ' ';
                else if(
$mode == JPAD_AVERAGE
                   
$words[(($diff / count($words)) +
                            (
$diff % count($words)) +
                            (
count($words) - ($diff % count($words))))
                            /
3] .= ' ';
                else if(
$mode == JPAD_LEFT$words[$diff % count($words)] .= ' ';
                else if(
$mode == JPAD_RIGHT) $words[count($words) - ($diff % count($words))] .= ' ';
               
               
// Next diff, please...
               
$diff--;
            }
        }
        else
        {
           
$words = explode(' ', $line);
        }
       
       
$final .= implode(' '$words) . "\n";
    }
   
   
// Return the final string
   
return $final;
}
?>

Examples of output for the average algorithm:

Lorem ipsum dolor            sit amet, consectetur
adipisicing elit, sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud  exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute
irure dolor in    reprehenderit in voluptate velit
esse cillum dolore       eu fugiat nulla pariatur.
Excepteur sint occaecat    cupidatat non proident,
sunt in culpa qui  officia deserunt mollit anim id
est laborum.          

(50 characters wide)
darkimmortal at dkimmortal dot com
26-Jan-2008 05:35
This function will provide word-wrap functionality to Firefox (most other browsers have a CSS alternative) by using a zero-width character between every character of any word that goes past the limited size.

<?php
/**
* @desc Wraps a string using a zero-width character between each character of any word past the size limit.
* @param    string  String to wrap
* @param    int     Word length limit
*
* @return   string  Cut string
*/
function cut_word($txt, $where=12) {
    if (empty(
$txt)) return false;
    for (
$c = 0, $a = 0, $g = 0; $c<strlen($txt); $c++) {
       
$d[$c+$g]=$txt[$c];
        if (
$txt[$c]!=" ") $a++;
        else if (
$txt[$c]==" ") $a = 0;
        if (
$a>$where) {
           
$g++;
           
$d[$c+$g]="&#8203;";
        }
    }
    return
implode("", $d);
}
?>
me at me dot com
15-Jan-2008 03:42
<?php

#for those who don't like word-wrap

function ($string, $max_length) {

$a_string = explode(" ",$string);

foreach (
$a_string as $value)
{
    if (
strlen($value) > $max_length)
    {   
       
$length = strlen($value);
       
       
$repeats = $length / $max_length;
       
        for (
$i=0; $i<$repeats; $i++)
        {       
           
$str = substr ($value,($i*$max_length),$max_length);
            print
"<font color=red>".$str."</font><br />";
        }   
       
    } else {
    print
$value."<br />";   
    }   
}

}
?>
buganini at gmail dot com
30-Oct-2007 02:33
function strwidth($s){
/*
put some fix for ambiguous width hese
*/
                $ret = mb_strwidth($s, 'UTF-8');
                return $ret;
        }

        function mb_wordwrap($str, $wid, $tag){
                $pos = 0;
                $tok = array();
                $l = mb_strlen($str, 'UTF-8');
                if($l == 0){
                        return '';
                }
                $flag = false;
                $tok[0] = mb_substr($str, 0, 1, 'UTF-8');
                for($i = 1 ; $i < $l ; ++$i){
                        $c = mb_substr($str, $i, 1, 'UTF-8');
                        if(!preg_match('/[a-z\'\"]/i',$c)){
                                ++$pos;
                                $flag = true;
                        }elseif($flag){
                                ++$pos;
                                $flag = false;
                        }
                        $tok[$pos] .= $c;
                }

                $linewidth = 0;
                $pos = 0;
                $ret = array();
                $l = count($tok);
                for($i = 0 ; $i < $l ; ++$i){
                        if($linewidth + ($w = strwidth($tok[$i])) > $wid){
                                ++$pos;
                                $linewidth = 0;
                        }
                        $ret[$pos] .= $tok[$i];
                        $linewidth += $w;
                }
                return implode($tag, $ret);
        }
andrej dot pavlovic at gmail dot com
25-Oct-2007 10:12
Disregard my note from below, since the function only works for utf8 strings that can be encoded into ISO-8859-1.
andrej dot pavlovic at gmail dot com
25-Oct-2007 08:36
Wordwrap for utf8. Easy to understand and works with the $cut parameter:

<?php

function utf8_wordwrap($str,$width=75,$break="\n", $cut=false){
    return
utf8_encode(wordwrap(utf8_decode($str), $width, $break, $cut));
}

?>
golanzakaiATpatternDOTcoDOTil
07-Oct-2007 10:39
/**
     * Wordwrap without unnecessary word splitting using multibyte string functions
     *
     * @param string $str
     * @param int $width
     * @param string $break
     * @return string
     * @author Golan Zakai <golanzakaiATpatternDOTcoDOTil>
     */
    function _wordwrap( $str, $width, $break ) {
        $formatted = '';
        $position = -1;
        $prev_position = 0;
        $last_line = -1;
       
        /// looping the string stop at each space
        while( $position = mb_stripos( $str, " ", ++$position, 'utf-8' ) ) {
            if( $position > $last_line + $width + 1 ) {
                $formatted.= mb_substr( $str, $last_line + 1, $prev_position - $last_line - 1, 'utf-8' ).$break;
                $last_line = $prev_position;
            }
            $prev_position = $position;
        }
       
        /// adding last line without the break
        $formatted.= mb_substr( $str, $last_line + 1, mb_strlen( $str ), 'utf-8' );
        return $formatted;
    }
me at NOJUNKPLEASE dot callum-macdonald dot com
24-Sep-2007 08:52
luismorrison's function will split a string into a first and second line *only*. If your string is 100 characters long and you wrap at 30 characters you will end up with 30 chars on line 1 and 70 on line 2.

I've included an English translation here for reference as I was going round the bend trying to figure it out in Spanish! :)

<?php
   
function splitstroverflow($chain,$length) {
       
$pri_line = array();
       
$seg_line = array();
       
$words = explode(" ",trim($chain));
      
        for (
$i = 0; $i < count($words); $i++) {
           
$sum += strlen($words[$i])+1;
            if (
$sum >= $length) $seg_line[] = $words[$i] . " ";
            else
$pri_line[] = $words[$i] . " ";
        }
      
        for (
$i = 0; $i < count($pri_line); $i++)
           
$lines[0] .= $pri_line[$i];
          
        for (
$i = 0; $i < count($seg_line); $i++)
           
$lines[1] .= $seg_line[$i];
      
        return
$lines;
    }
?>
luismorrison at gmail dot com
16-Aug-2007 10:21
i wrote this by mistake because i didn't know that the same function already exists in PHP.. well shit happens, its quite simple but maybe this will help you someday in your project. The difference is that the one i wrote, called 'splitstroverflow()', cuts given string and parses into arrays to do whatever you like with them.

<?php
   
function splitstroverflow($cadena,$longitud) {
       
$pri_renglon = array();
       
$seg_renglon = array();
       
$palabras = explode(" ",trim($cadena));
       
        for (
$i = 0; $i < count($palabras); $i++) {
           
$sum += strlen($palabras[$i])+1;
            if (
$sum >= $longitud) $seg_renglon[] = $palabras[$i] . " ";
            else
$pri_renglon[] = $palabras[$i] . " ";
        }
       
        for (
$i = 0; $i < count($pri_renglon); $i++)
           
$renglones[0] .= $pri_renglon[$i];
           
        for (
$i = 0; $i < count($seg_renglon); $i++)
           
$renglones[1] .= $seg_renglon[$i];
       
        return
$renglones;
    }
?>

Usage:
<?php
    splitstroverflow
(str longString,int lenght);
   
$myrow = splitstroverflow("This is my long long long string",18);

   
// the array counts 2 elements
    // Array
    // (
    //     [0] => "This is my long"
    //     [1] => "long long string"
    // )
?>
fatchris
29-Jun-2007 02:11
If your string has some html entities, then it might split one in half. e.g.

<?php
/*
Outputs (Renders):

Préf&-
eacute;rence-
s e-mails

*/

echo wordwrap("Pr&eacute;f&eacute;rences e-mails");

?>

To solve this, you can use the following function:

<?php

function wordwrap2( $str, $width = 75, $break = '\n', $cut = true ) {
 
$str = html_entity_decode( $str ); //first decode
 
$out = wordwrap( $str, $width, $break, $cut ); //now wordwrap
 
$out = htmlentities( $out ); //re-encode the entities
 
$out = str_replace( htmlentities( $break ), $break, $out ); //put back the break
 
return $out;
}

?>
phpsales at gmail dot com
16-May-2007 09:53
########################################
# Break long words with out cutting HTML tags.
########################################

/* Break Long Words (string, int, char) */

function breakLongWords($str, $maxLength, $char){
    $wordEndChars = array(" ", "\n", "\r", "\f", "\v", "\0");
    $count = 0;
    $newStr = "";
    $openTag = false;
    for($i=0; $i<strlen($str); $i++){
        $newStr .= $str{$i};   
       
        if($str{$i} == "<"){
            $openTag = true;
            continue;
        }
        if(($openTag) && ($str{$i} == ">")){
            $openTag = false;
            continue;
        }
       
        if(!$openTag){
            if(!in_array($str{$i}, $wordEndChars)){//If not word ending char
                $count++;
                if($count==$maxLength){//if current word max length is reached
                    $newStr .= $char;//insert word break char
                    $count = 0;
                }
            }else{//Else char is word ending, reset word char count
                    $count = 0;
            }
        }
       
    }//End for   
    return $newStr;
}
Rekcor
27-Mar-2007 07:36
Improved version of egyptechno[at]gmail.com's wordCut.

In this improved function, the length of $sMessage is taken into consideration while cutting the text, so the returned string is never longer than $iMaxLength. Besides that, whole words are cut as well.

<?php
/**
 * function wordCut($sText, $iMaxLength, $sMessage)
 *
 * + cuts an wordt after $iMaxLength characters
 *
 * @param  string   $sText       the text to cut
 * @param  integer  $iMaxLength  the text's maximum length
 * @param  string   $sMessage    piece of text which is added to the cut text, e.g. '...read more'
 *
 * @returns string
 **/    
function wordCut($sText, $iMaxLength, $sMessage)
{
   if (
strlen($sText) > $iMaxLength)
   {
      
$sString = wordwrap($sText, ($iMaxLength-strlen($sMessage)), '[cut]', 1);
      
$asExplodedString = explode('[cut]', $sString);
      
       echo
$sCutText = $asExplodedString[0];
      
      
$sReturn = $sCutText.$sMessage;
   }
   else
   {
      
$sReturn = $sText;
   }
  
   return
$sReturn;
}
?>
Peter
19-Dec-2006 05:00
The main concern when you have a text in a cell is for long words that drags the cell margins. This function will break words in a text that have more then $nr characters using the "-" char.

function processtext($text,$nr=10)
    {
        $mytext=explode(" ",trim($text));
        $newtext=array();
        foreach($mytext as $k=>$txt)
        {
            if (strlen($txt)>$nr)
            {
                $txt=wordwrap($txt, $nr, "-", 1);
            }
            $newtext[]=$txt;
        }
        return implode(" ",$newtext);
    }
tylernt at gmail dot com
28-Nov-2006 11:39
I wrote this to keep long strings from making my tables wider than the browser window. To lessen the impact on performance, only call this function on strings longer than 'X' characters.

// This function will insert the 'wbr' (optional linebreak) tag
// to wrap words in $string longer than 10 characters,
// but will not break inside HTML tags
function mywordwrap($string)
{
$length = strlen($string);

for ($i=0; $i<=$length; $i=$i+1)
    {
    $char = substr($string, $i, 1);
    if ($char == "<")
        $skip=1;
    elseif ($char == ">")
        $skip=0;
    elseif ($char == " ")
        $wrap=0;

    if ($skip==0)
        $wrap=$wrap+1;

    $returnvar = $returnvar . $char;

    if ($wrap>9) // alter this number to set the maximum word length
        {
        $returnvar = $returnvar . "<wbr>";
        $wrap=0;
        }
    }

return $returnvar;

}
austinbarton at gmail dot com
21-Nov-2006 01:03
In response to some of the alternative wordwrap functions that attempt to work with HTML:

They do not work with anything that uses <br> or <p> to force breaks. This occurs as the replacement text does not match the original as it is not breaking up words appropriately.

The solution is to ignore formatting tags in the strip_tags function call ie:

strip_tags( $string, '<br>' );
Edward
18-Oct-2006 06:12
I needed a function to justify the text - not just wrap it. I came up with this:

<?
function justify($text, $width, $break) {
        $marker = "__$%@random#$()__";

        // lines is an array of lines containing the word-wrapped text
        $wrapped = wordwrap($text, $width, $marker);
        $lines = explode($marker, $wrapped);
       
        $result = "";
        foreach ($lines as $line_index=>$line) {
                $line = trim($line);
               
                $words = explode(" ", $line);
                $words = array_map("trim", $words);
                $wordcount = count($words);
                $wordlength = strlen(implode("", $words));
               
                if (3*$wordlength < 2*$width) {
                        // don't touch lines shorter than 2/3 * width
                        continue;
                }
               
                $spaces = $width - $wordlength;
               
                $index = 0;
                do {
                        $words[$index] = $words[$index] . " ";
                        $index = ($index + 1) % ($wordcount - 1);
                        $spaces--;
                } while ($spaces>0);
               
                $lines[$line_index] = implode("", $words);
        }
       
        return implode($break, $lines);
}
?>
egyptechno [at] gmail.com
04-Oct-2006 03:12
Another function to cut text afterr $limit letters ,

function :

function wordCut($text, $limit, $msg){
    if (strlen($text) > $limit){
        $txt1 = wordwrap($text, $limit, '[cut]');
        $txt2 = explode('[cut]', $txt1);
        $ourTxt = $txt2[0];
        $finalTxt = $ourTxt.$msg;
    }else{
        $finalTxt = $text;
    }
    return $finalTxt;
}

return :
The limited text

description :
It takes the text, add the string '[cut]' every $limit text by wordwrap, then we explode the text with '[cut]' and takes the first element in the array which we need !

how to use :
wordCut($my_text, 200, '... read more');

EgypTechno
feedback at realitymedias dot com
01-Oct-2006 11:50
Here is a way to use wordwrap to add spaces to long "words", without breaking link tags -- I came up with this as there apparently is no way to reproduce this effect with a regular expression.

This is mostly used in users-posts where your output layout could be broken with words that are longer than what the container object can take - it will not effect html tags (such as <a href="aaaaaaaaaaaaaaaaaaaaaaaaa"> so you don't end up with broken links !

$body = 'this is a text with aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa looooooooooooooooooooooooooooong word! <a href="http://ww.this.site.com/with/a/loooooooooooooooooooooong/url'> ... </a>';

foreach(explode(" ", strip_tags($body)) as $key => $line) {
  if (strlen($line) > 35) $body = str_replace($line, wordwrap($line, 25, " ", 1), $body);
}

(In case you would like the same thing without the tags protection, there is a regular expression way;

$body = preg_replace("/([^\s]{35})/","$1 ",$body);
19-Jul-2006 09:47
I've written another implemention of textwrap, becourse the last one didnt work for me.

<?php
function textwrap ($text, $length, $break) {
   
$pure=strip_tags($text);
   
$words=str_word_count($pure, 1);
    foreach (
$words as $word) {
        if (
strlen($word) > $length) {
           
$newword=wordwrap($word, $length, $break, TRUE);
           
$text=str_replace($word, $newword, $text);
        }
    }
    return
$text;
}
?>
Paolo Stefan
11-May-2006 04:13
Hi everyone,
I have modified textWrap(); this one works just fine (the last one had a buggy regular expression!) and also gives you the chance to choose the line separator (3rd param).
Enjoy :)

<?php

function textWrap($text, $size, $separator="\\r\\n" ) {

   
$new_text = '';
   
$text_1 = explode('>',$text);
   
$sizeof = sizeof($text_1);
   
$remain = $size;
   
    for (
$i=0; $i<$sizeof; ++$i) {
      
      
$text_2 = explode('<',$text_1[$i]);
      
       if (!empty(
$text_2[0])){
          
$perl = '/([^\\n\\r .]{'. $remain .',})/i';
           
$possibly_splitted= preg_replace( $perl, '$1'.$separator, $text_2[0] );
           
           
$splitted = explode($separator,$possibly_splitted);
           
$remain -= strlen($splitted[0]);
            if(
$remain<=0) $remain = $size;
           
          
$new_text .= $possibly_splitted;
       }
   
       if (!empty(
$text_2[1])) $new_text .= '<' . $text_2[1] . '>';
    }
    return
$new_text;
}
?>
info [ät] travelguides24.com
27-Apr-2006 02:34
this one is nice, because it does not put any linebreaks or empty spaces if there is enough space. It is not propper html as seen by validator.w3.org, but it works on IE and Moz.

function splitLongWords($text, $max) {
    return preg_replace( '/([^\s]{'.$max.'})(?=[^\s])/', '$1<wbr>', $text);
}
ab_at_notenet(dot)dk
17-Apr-2006 06:29
The function for wrapping strings without wrapping the html might need a second parameter (lenght):

<?php
function textWrap($text, $size = 90) {
   
$new_text = '';
   
$text_1 = explode('>',$text);
   
$sizeof = sizeof($text_1);
    for (
$i=0; $i<$sizeof; ++$i) {
       
$text_2 = explode('<',$text_1[$i]);
        if (!empty(
$text_2[0])) {
           
$new_text .= preg_replace('#([^\n\r .]{'. $size .'})#i', '\\1  ', $text_2[0]);
        }
        if (!empty(
$text_2[1])) {
           
$new_text .= '<' . $text_2[1] . '>';  
        }
    }
    return
$new_text;
}
?>
EngrKhalid
10-Feb-2006 08:54
I found this function helpful to cut long words without adding spaces:

function fWrap ( $vText, $vMax ) {
    $vWords = explode(" ", $vText);
    foreach ( $vWords as $i =>$w ) {
        if ( strlen ( $vWords[$i] ) > $vMax ) { $vWords[$i] = wordwrap( $vWords[$i], $vMax, "<wbr>", 1 ); }
    }
    return implode(" ", $vWords);
}

Regards.
lean[--]roico[at]gm[--]ail[dot]com
16-Jan-2006 08:37
To @Anthony Catel

Wouldn't be easier, more correct and more simple to cut the words having more characters than the $limit parameter like the following code?

<?
function cut_words( $txt , $limit, $html_nl = 0 )
{
    $str_nl = $html_nl == 1 ? "<br>" : ( $html_nl == 2 ? "<br />" : "\n" );
    $pseudo_words = explode( ' ',$txt );
    $txt = '';
    foreach( $pseudo_words as $v )
    {
        if( ( $tmp_len = strlen( $v ) ) > $limit )
        {
            $final_nl = is_int( $tmp_len / $limit );
            $txt .= chunk_split( $v, $limit, $str_nl );
            if( !$final_nl )
                $txt = substr( $txt, 0, - strlen( $str_nl ) );
            $txt .= ' ';
        }
        else
            $txt .= $v . ' ';
    }
    return substr( $txt, 0 , -1 );
}
?>

For using it this is a sample:
<?
function cut_words( 'big words text here' , 15, 2 );
?>
Anthony Catel (paraboul at gmail . com)
15-Jan-2006 01:56
<?php
   
function cut_word($txt, $where) {
        if (empty(
$txt)) return false;
        for (
$c = 0, $a = 0, $g = 0; $c<strlen($txt); $c++) {
           
$d[$c+$g]=$txt[$c];
            if (
$txt[$c]!=" ") $a++;
            else if (
$txt[$c]==" ") $a = 0;
            if (
$a==$where) {
           
$g++;
           
$d[$c+$g]="<br />";
           
$a = 0;
            }
        }
        return
implode("", $d);
    }
?>

Wrap word for cut only long word :
<?
    cut_word($sentence, 25);
?>
matyx666 at yahoo dot com dot ar
09-Jan-2006 08:19
This function wraps a string with the characters count specified:

    static function cortarCaracteres($sText, $iCharsCount, $sCutWith = "...") {
        $sTextLength = strlen($sText);

        if($sTextLength <= $iCharsCount) {
            return $sText;
        }

        if($sTextLength+strlen($sCutWith) > $iCharsCount) {
            return substr($sText, 0, $iCharsCount-strlen($sCutWith)).$sCutWith;
        }

        $iLeftOverChars = strlen($sCutWith) - ($sTextLength - $iCharsCount);

        return substr($sText, 0, $sTextLength-$iLeftOverChars).$sCutWith;
    }

Regards!
Dave Lozier - dave at fusionbb.com
30-Nov-2005 12:48
If you'd like to break long strings of text but avoid breaking html you may find this useful. It seems to be working for me, hope it works for you. Enjoy. :)

    function textWrap($text) {
        $new_text = '';
        $text_1 = explode('>',$text);
        $sizeof = sizeof($text_1);
        for ($i=0; $i<$sizeof; ++$i) {
            $text_2 = explode('<',$text_1[$i]);
            if (!empty($text_2[0])) {
                $new_text .= preg_replace('#([^\n\r .]{25})#i', '\\1  ', $text_2[0]);
            }
            if (!empty($text_2[1])) {
                $new_text .= '<' . $text_2[1] . '>';   
            }
        }
        return $new_text;
    }
frans-jan at van-steenbeek dot R-E-M-O-V-E dot net
16-Nov-2005 06:17
Using wordwrap is usefull for formatting email-messages, but it has a disadvantage: line-breaks are often treated as whitespaces, resulting in odd behaviour including lines wrapped after just one word.

To work around it I use this:

<?php
 
function linewrap($string, $width, $break, $cut) {
 
$array = explode("\n", $string);
 
$string = "";
  foreach(
$array as $key => $val) {
  
$string .= wordwrap($val, $width, $break, $cut);
  
$string .= "\n";
  }
  return
$string;
 }
?>

I then use linewrap() instead of wordwrap()

hope this helps someone
tjomi4 at yeap dot lv
23-Sep-2005 03:26
utf8_wordwrap();

usage: utf8_wordwrap("text",3,"<br>");
coded by tjomi4`, thanks to SiMM.
web: www.yeap.lv

<?php

function utf8_wordwrap($str,$len,$what){
# usage: utf8_wordwrap("text",3,"<br>");
# by tjomi4`, thanks to SiMM.
# www.yeap.lv
$from=0;
$str_length = preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty);
$while_what = $str_length / $len;
while(
$i <= round($while_what)){
$string = preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
                      
'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
                      
'$1',$str);
$total .= $string.$what;
$from = $from+$len;
$i++;
}
return
$total;
}
?>
vex
19-Aug-2005 11:19
Useful in chat's, shoutboxes sth. like that (simply written):

$text = explode(" ", $text);
$l=count($text);
$counter=0;

while($counter<=$l) {
$text[$counter] = wordwrap($text[$counter], 20, " ", 1);
$counter++;
}

$text=implode(" ", $text);
pawan at shopsbs dot com
14-Aug-2005 10:32
I wanted to use this function to add a particular text after a certain word count. Here is how I implemented it:

$content = wordwrap($content, 200, "....<br /><!--more-->\n");

Above code adds the text '...<br/><!--more-->\n' after a 200 word count. I know there are a million ways this can be done in PHP. Go PHP!
x403 at yandex dot ru
23-Jun-2005 06:35
String lenght control:

if (str_word_count($STRING) > 0)
    $div = strlen($STRING) / str_word_count($STRING);
else return " ";

if ( $div > 25 ) return wordwrap($STRING, 25, "\n", 1);

return $STRING;

// Maximum word lenght is 25 chars
ajd at cloudiness dot com
13-Jun-2005 02:13
Kyle's preserve_wordwrap is handy after fixing this error:

     $strs = explode($tstr,$br);
should be
     $strs = explode($br,$tstr);
Kyle
31-May-2005 11:34
Yet-another-wordwrap-improvement... If you attempt to wordwrap() lines that already contain some line-breaks that you want to maintain, a simple wrapper around wordwrap can help. For example:

function preserve_wordwrap($tstr, $len = 75, $br = '\n') {
     $strs = explode($tstr,$br);
     $retstr = "";
     foreach ($strs as $str) {
          $retstr .= wordwrap($str,$len,$br) . $br;
     }
     return $retstr;
}

I used a function like this for pulling quotes for my email out of a mysql database and formatting them for use in an email. Some quotes had multiple lines (e.g. a short conversation-style quote) that I wanted to maintain yet still word-wrap correctly.
09-May-2005 10:33
Note that wordwrap is meant for...wrapping words.  If you're simply trying to break a string into evenly sized pieces, take a look at chunk_split and str_split.
bruceboughton @ google mail
04-May-2005 03:08
I found that wordwrap deletes the spaces it wraps on. If you want to break up a string which doesn't consist of words, you may find this behaviour undesirable, as I did when trying to wordwrap a Regular Expression to 80 characters (for display along with test string, matches, etc.).

To preserve the spaces and still achieve a consistent cut length, you need to replace spaces with a suitable one-character replacement. I chose the ASCII non-printing character SUB (ASCII #26; some old telephone code meaning substitute):

<?php
$regex
= str_replace(' ', chr(26), $regex);
$regex= wordwrap($regex, 80, '<br />'<