PHP Conference Japan 2024

chunk_split

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

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

描述

chunk_split(字符串 $string, 整数 $length = 76, 字符串 $separator = "\r\n"): 字符串

可用于将字符串分割成较小的块,这对于例如将base64_encode() 的输出转换为符合 RFC 2045 语义非常有用。它每 length 个字符插入 separator

参数

string

要分割的字符串。

length

块长度。

separator

行尾序列。

返回值

返回分割后的字符串。

示例

示例 #1 chunk_split() 示例

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

参见

添加注释

用户贡献的注释 19 条注释

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 中的许多其他函数都能做到这一点,甚至 PHP 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
匿名用户
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 中插入某些内容(在我的例子中,是 `` 标签,以允许长文本换行),这将非常有用。

<?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;
}
?>
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 四舍五入到两位小数,使用点 (".")
//作为小数点,空格 (" ") 作为千位分隔符。

?>
kevin @t hyguard,com
19 年前
不是很明显,但是……

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

$long_str = str_replace( "\r\n", "", $chunked_str );
harish at thespitbox dot net
19 年前
另一种对数字进行千位分组的方法,更简单,PHP 中内置了 :)

www.php.net/number_format
mark [at] d0gz [dot] net
17 年前
当使用 ssmtp 进行简单的命令行邮件发送时

$mail_to = "[email protected]";
$msg = "this would be an actual base64_encoded gzip msg";
$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 对长行处理不佳,可能会损坏您的邮件。
dampee at earthlink dot net
15 年前
我发现这对于模拟各种类型的纸牌洗牌非常有用。它很有趣,但可以模拟多次牌面切割和其他(不完美)的随机事件。

<?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
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;
}
?>
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;
}
To Top