chunk_split

(PHP 4, PHP 5, PHP 7, PHP 8)

chunk_split将字符串分割成更小的块

描述

chunk_split(string $string, int $length = 76, string $separator = "\r\n"): string

可用于将字符串分割成更小的块,这对于例如将 base64_encode() 输出转换为匹配 RFC 2045 语义很有用。它在每 length 个字符后插入 separator

参数

string

要分割的字符串。

length

块长度。

separator

行结束符序列。

返回值

返回分割后的字符串。

示例

示例 #1 chunk_split() 示例

<?php
// 使用 RFC 2045 语义格式化 $data
$new_string = chunk_split(base64_encode($data));
?>

参见

添加注释

用户贡献的注释 20 则注释

vijit at mail dot ru
8 年前
作为 qeremy [atta] gmail [dotta] com 的替代方案
对于多字节字符串的二进制安全分块,有一个更短的方法

<?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";
?>

р�
�с
с�
�и
й

рус
ски
й
qeremy [atta] gmail [dotta] com
12 年前
Unicode 字符串的替代方案;

<?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
chris AT w3style.co DOT uk
18 年前
我不确定这在哪些版本中也会发生,但在 PHP 5.0.4 中 chunk_split() 的输出与其他 PHP 版本的输出不匹配。

在我使用过的所有 PHP 版本中,除了 5.0.4 之外,chunk_split() 在字符串末尾添加了分隔符(\r\n)。但在 PHP 5.0.4 中,这种情况不会发生。这对我的一个库造成了相当严重的影响,因此它也可能影响其他不了解此问题的人。
chris at ocproducts dot com
7 年前
函数描述略有不准确。还会添加尾随的 $end。
mv@NOSPAM
20 年前
解决 chunk_split() 添加的最后一个字符串问题的最佳方法是

<?php
$string
= '1234';
substr(chunk_split($string, 2, ':'), 0, -1);
// 将返回 12:34
?>
hansvane at yahoo dot com dot ar
17 年前
这个函数非常简单,许多其他函数在 PHP 5 中甚至在 4 中也实现了这个功能。这个函数的优点是在 php 3.0.6 和 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;
}

// 用于

echo split_hjms_chars("This is your text",6,"...");

// 将返回

This i...

它用于在预览列表中截取长文本,如果服务器很旧。

希望对大家有所帮助。Hans Svane
Anonymous
10 年前
重要的是最大行长和推荐行长。标准规定
"消息中的行必须最多 998 个字符,不包括 CRLF,但推荐行最多 78 个字符,不包括 CRLF。"

请参阅 PHP 手册中的 chunk_split(),它默认设置为 76 个字符长的块,并在行尾添加 "\r\n"。
neos at blizzz dot ru
16 年前
针对 UTF-8 编码的西里尔字符,chunk_split 的“版本”

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);
}
}

这是俄语的示例
Royce
16 年前
这是我编写的 Chunk Split 版本,它不会拆分 HTML 实体。如果您需要在 HTML 中注入某些内容(在我的情况下,是 <wbr/> 标签,以允许长文本换行),这很有用。

<?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;
}
?>
kevin @t hyguard,com
18 年前
不太明显,但是...

您可以使用以下方法取消 chunk_split()

$long_str = str_replace( "\r\n", "", $chunked_str );
xamine at gmail dot com
18 年前
回复“adrian at zhp dot inet dot pl”的数字分组函数
<?php
$number
= strrev(chunk_split (strrev($number), 3,' '));
//如果 $number 是 '1234567',结果是 '1 234 567'。
?>

有一个更简单的方法,使用内置的 number_format() 函数。

<?php
$number
= number_format($number,2,"."," ");

//这将把 $number 四舍五入到 2 位小数,使用点 (".")
//作为小数点,空格 (" ") 作为千位分隔符。

?>
belal dot nabeh at gmail dot com
14 年前
如果您使用 UTF-8 字符集,您将遇到阿拉伯语的问题
为了解决这个问题,我使用了这个函数

<?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;
}
?>
mark [at] d0gz [dot] net
17 年前
当使用 ssmtp 进行简单的命令行邮件发送时

$mail_to = "[email protected]";
$msg = "这将是实际的 base64 编码 gzip 消息";
$date = date(r);
$mail = "X-FROM: [email protected] \n";
$mail .= "X-TO: ".$mail_to. " \n";
$mail .= "To: ".$mail_to. " \n";
$mail .= "Date: $date \n";
$mail .= "From: [email protected] \n";
$mail .= "Subject: lifecheck \n";
$mail .= $msg." \n";
exec("echo '$mail' | /usr/sbin/ssmtp ".$mail_to);

请确保在您的消息主体上调用 chunk_split() - ssmtp 对于长行会变得不高兴,并随后会破坏您的消息。
harish at thespitbox dot net
19 年前
另一种在数字中分组千位的方法,更简单,内置于 PHP 中 :)

www.php.net/number_format
dampee at earthlink dot net
14 年前
我发现这对于模拟各种类型的纸牌洗牌非常有用。它很幽默,但可以模拟多副牌的切割和其他(不完美)的随机事件。

<?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;
}
?>
Danilo
20 年前
>> chunk_split 还会在最后一个出现的位置添加断点。

这应该不是问题

substr(chunk_split('FF99FF', 2, ':'),0,8);
将返回 FF:99:FF
Kevin
19 年前
对于 phpkid

这是一个更简单的解决方案。

<?php
function longWordWrap($string) {
$string = str_replace("\n", "\n ", $string); // 在换行符后添加一个空格,这样只有 \n 分隔的两个词不会被视为一个词
$words = explode(" ", $string); // 现在按空格分割
foreach ($words as $word) {
$outstring .= chunk_split($word, 12, " ") . " ";
}
return
$outstring;
}
?>
tim at weird spots in my crotch dot com
16 年前
@Royce

我认为这更好,因为您仍然可以在文本中使用&符号

<?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;
}
?>
phpkid
19 年前
我在编写一个留言板时遇到了问题,如果里面有很长的词,<TD> 会不断扩展。但我用这个代码解决了这个问题。

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;
}
Peter from dezzignz.com
14 年前
chunk_split() 不是多字节安全的。如果你需要多字节安全的功能,这里就有了。

<?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 Top