chunk_split()
(PHP 4, PHP 5, PHP 7)
将字符串分割成小块
说明
chunk_split(string $body[,int $chunklen= 76[,string $end= "rn"]]) : string
使用此函数将字符串分割成小块非常有用。例如将base64_encode()的输出转换成符合 RFC 2045 语义的字符串。它会在每$chunklen个字符后边插入$end。
参数
- $body
要分割的字符。
- $chunklen
分割的尺寸。
- $end
行尾序列符号。
返回值
返回分割后的字符。
范例
Example #1chunk_split()例子
<?php // 使用 RFC 2045 语义格式化 $data $new_string = chunk_split(base64_encode($data)); ?>
参见
str_split()
将字符串转换为数组explode()
使用一个字符串分割另一个字符串- split() 用正则表达式将字符串分割到数组中
wordwrap()
打断字符串为指定数量的字串- » RFC 2045
An alternative for unicode strings; <?php function chunk_split_unicode($str, $l = 76, $e = "\r\n") { $tmp = array_chunk( preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $l); $str = ""; foreach ($tmp as $t) { $str .= join("", $t) . $e; } return $str; } $str = "Yarım kilo çay, yarım kilo şeker"; echo chunk_split($str, 4) ."\n"; echo chunk_split_unicode($str, 4); ?> Yar� �m k ilo çay , ya rım kil o ş eker Yarı m ki lo ç ay, yarı m ki lo ş eker
As an alternative for qeremy [atta] gmail [dotta] com There is much shorter way for binarysafe chunking of multibyte string: <?php function word_chunk($str, $len = 76, $end = "\n") { $pattern = '~.{1,' . $len . '}~u'; // like "~.{1,76}~u" $str = preg_replace($pattern, '$0' . $end, $str); return rtrim($str, $end); } $str = 'русский'; echo chunk_split($str, 3) ."\n"; echo word_chunk($str, 3) . "\n"; ?> р� �с с� �и й рус ски й
I'm not sure what versions this also occurs in but the output of chunk_split() in PHP 5.0.4 does not match the output in other versions of PHP. In all versions of PHP I have used, apart from 5.0.4 chunk_split() adds the separator (\r\n) to the end of the string. But in PHP 5.0.4 this does not happen. This had a fairly serious impact on a library I maintain so it may also affect others who are not aware of this.
The description of the function is slightly inaccurate. A trailing $end is also added.
the best way to solve the problem with the last string added by chunk_split() is: <?php $string = '1234'; substr(chunk_split($string, 2, ':'), 0, -1); // will return 12:34 ?>
If you are using UTF-8 charset you will face a problem with Arabic language to solve this problem i used this function <?php function chunk_split_($text,$length,$string_end) { $text = iconv("UTF-8","windows-1256",$text); $text = str_split($text); foreach($text as $val) { if($a !== $val) { $a = $val; $x = 0; }else{ $a = $val; $x++; } if($x > $length) { $new_text .= $val.$string_end; $x = 0; }else { $new_text .= $val; } } $new_text = iconv("windows-1256","UTF-8",$new_text); return $new_text; } ?>
Not quite completely obvious, but... you can un_chunk_split() by: $long_str = str_replace( "\r\n", "", $chunked_str );
"version" of chunk_split for cyrillic characters in UTF-8 public function UTFChunk($Text,$Len = 10,$End = "\r\n") { if(mb_detect_encoding($Text) == "UTF-8") { return mb_convert_encoding( chunk_split( mb_convert_encoding($Text, "KOI8-R","UTF-8"), $Len,$End ), "UTF-8", "KOI8-R" ); } else { return chunk_split($Text,$Len,$End); } } this is example for russian language
another way to group thousands in a number, which is much simpler, is built into PHP :) www.php.net/number_format
Important note is the maximum line length and the recommended one. The standard says: "Lines in a message MUST be a maximum of 998 characters excluding the CRLF, but it is RECOMMENDED that lines be limited to 78 characters excluding the CRLF. " See PHP manual for chunk_split() Which is set to 76 characters long chunk and "\r\n" at the end of line by default.
Here's a version of Chunk Split I wrote that will not split html entities. Useful if you need to inject something in html (in my case, <wbr/> tags to allow for long text wrapping). <?php function HtmlEntitySafeSplit($html,$size,$delim) { $pos=0; for($i=0;$i<strlen($html);$i++) { if($pos >= $size && !$unsafe) { $out.=$delim; $unsafe=0; $pos=0; } $c=substr($html,$i,1); if($c == "&") $unsafe=1; elseif($c == ";") $unsafe=0; $out.=$c; $pos++; } return $out; } ?>
>> chunk_split will also add the break _after_ the last occurence. this should be not the problem substr(chunk_split('FF99FF', 2, ':'),0,8); will return FF:99:FF
I've found this quite useful for simulating various kinds of shuffles with cards. It is humorous but can imitate multiple deck cuts and other (imperfectly) random events. <?php function truffle_shuffle($body, $chunklen = 76, $end = "\r\n") { $chunk = chunk_split($body, $chunklen, "-=blender=-"); $truffle = explode("-=blender=-",$chunk); $shuffle = shuffle($truffle); $huknc = implode($end,$shuffle); return $huknc; } ?>
When using ssmtp for simple command line mailing: $mail_to = "destination@emailbox.com"; $msg = "this would be an actual base64_encoded gzip msg"; $date = date(r); $mail = "X-FROM: root@sender.org \n"; $mail .= "X-TO: ".$mail_to. " \n"; $mail .= "To: ".$mail_to. " \n"; $mail .= "Date: $date \n"; $mail .= "From: root@sender.org \n"; $mail .= "Subject: lifecheck \n"; $mail .= $msg." \n"; exec("echo '$mail' | /usr/sbin/ssmtp ".$mail_to); be sure to invoke chunk_split() on your message body - ssmtp becomes unhappy with long lines and will subsequently trash your message.
In reply to "adrian at zhp dot inet dot pl" digit grouping function: <?php $number = strrev(chunk_split (strrev($number), 3,' ')); //If $number is '1234567', result is '1 234 567'. ?> There is a much more simple way of doing this, by using the built-in number_format() function. <?php $number = number_format($number,2,"."," "); //This will round $number to 2 decimals, use the dot (".") //as decimal point, and the space (" ") as thousand sepparator. ?>
This function is very simple and many other functions make this on PHP 5 and even some ones in 4 the good think about this one is that work on php 3.0.6 and 4 function split_hjms_chars($xstr, $xlenint, $xlaststr) { $texttoshow = chunk_split($xstr,$xlenint,"\r\n"); $texttoshow = split("\r\n",$texttoshow); $texttoshow = $texttoshow[0].$xlaststr; return $texttoshow; } // For use echo split_hjms_chars("This is your text",6,"..."); // Will return This i... It is useful to cut long text on preview lists and if the server it's old. Hope it helps some one. Hans Svane
Well I have been having issues with a shoutbox I am coding it would keep expanding the <TD> if there were large words in it but I fixed it with this: function PadString($String){ $Exploded = explode(" ", $String); $Max_Parts = count($Exploded); $CurArray = 0; $OutString = ''; while($CurArray<=$Max_Parts) { $Peice_Size = strlen($Exploded[$CurArray]); if($Peice_Size>15) { $OutString .= chunk_split($Exploded[$CurArray], 12, " "); $CurArray++; } else { $OutString .= " ".$Exploded[$CurArray]; $CurArray++; } } return $OutString; }
@Royce I think this is better, since you can still use the ampersand in your text: <?php function HtmlEntitySafeSplit($html,$size,$delim) { $pos=0; for($i=0;$i<strlen($html);$i++) { if($pos >= $size && !$unsafe) { $out.=$delim; $unsafe=0; $pos=0; } $c=substr($html,$i,1); if($c == "&") $unsafe=1; elseif($c == ";") $unsafe=0; elseif($c == " ") $unsafe=0; $out.=$c; $pos++; } return $out; } ?>
chunk_split() is not multibyte safe. If you ever run into needing the function that is multibyte safe, here you go: <?php function mbStringToArray ($str) { if (empty($str)) return false; $len = mb_strlen($str); $array = array(); for ($i = 0; $i < $len; $i++) { $array[] = mb_substr($str, $i, 1); } return $array; } function mb_chunk_split($str, $len, $glue) { if (empty($str)) return false; $array = mbStringToArray ($str); $n = 0; $new = ''; foreach ($array as $char) { if ($n < $len) $new .= $char; elseif ($n == $len) { $new .= $glue . $char; $n = 0; } $n++; } return $new; } ?>
To phpkid: This is a much simpler solution. <?php function longWordWrap($string) { $string = str_replace("\n", "\n ", $string); // add a space after newline characters, so that 2 words only seperated by \n are not considered as 1 word $words = explode(" ", $string); // now split by space foreach ($words as $word) { $outstring .= chunk_split($word, 12, " ") . " "; } return $outstring; } ?>