wordwrap

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

wordwrap将字符串包装到给定数量的字符

说明

wordwrap(
    string $string,
    int $width = 75,
    string $break = "\n",
    bool $cut_long_words = false
): string

使用字符串断裂字符将字符串包装到给定数量的字符。

参数

string

输入字符串。

width

字符串将被包装的字符数。

break

使用可选的 break 参数来断开行。

cut_long_words

如果将 cut_long_words 设置为 true,则字符串始终在指定 width 处或之前包装。因此,如果您有一个大于给定宽度的单词,它将被分解。(参见第二个示例)。当为 false 时,即使 width 小于单词宽度,函数也不会拆分单词。

返回值

返回以指定长度包装的给定字符串。

示例

示例 #1 wordwrap() 示例

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

echo
$newtext;
?>

上面的示例将输出

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

示例 #2 wordwrap() 示例

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

echo
"$newtext\n";
?>

上面的示例将输出

A very
long
wooooooo
ooooord.

示例 #3 wordwrap() 示例

<?php
$text
= "A very long woooooooooooooooooord. and something";
$newtext = wordwrap($text, 8, "\n", false);

echo
"$newtext\n";
?>

上面的示例将输出

A very
long
woooooooooooooooooord.
and
something

参见

  • nl2br() - 在字符串中所有换行符之前插入 HTML 换行符
  • chunk_split() - 将字符串拆分为更小的块

添加备注

用户贡献的备注 23 个备注

18
ju1ius
12 年前
使用正则表达式,另一种对 utf-8 安全的 wordwrap 解决方案。
相当好的性能,并且可以在线性时间内工作。

<?php
function utf8_wordwrap($string, $width=75, $break="\n", $cut=false)
{
if(
$cut) {
// 匹配任何 1 到 $width 个字符长的字符串,后面跟着空格或 EOS,
// 否则匹配任何 $width 个字符长的字符串
$search = '/(.{1,'.$width.'})(?:\s|$)|(.{'.$width.'})/uS';
$replace = '$1$2'.$break;
} else {
// 使用先行断言来锚定模式的开头
// 避免单词长度超过 $width 时疯狂的回溯
$pattern = '/(?=\s)(.{1,'.$width.'})(?:\s|$)/uS';
$replace = '$1'.$break;
}
return
preg_replace($search, $replace, $string);
}
?>
当然不要忘记在 $width 和 $break 参数上使用 preg_quote,如果它们来自不受信任的输入。
5
michdingpayc
2 年前
对 10 年前 ju1ius 的 utf-8 安全的 wordwrap 的修正。
此版本解决了在输入字符串中第一个和最后一个单词没有添加换行符的问题。

<?php
function utf8_wordwrap($string, $width=75, $break="\n", $cut=false)
{
if(
$cut) {
// 匹配任何 1 到 $width 个字符长的字符串,后面跟着空格,
// 否则匹配任何 $width 个字符长的字符串
$search= '/(.{1,'.$width.'})(?:\s)|(.{'.$width.'})(?!$)/uS';
$replace = '$1$2'.$break;
} else {
// 使用后顾断言来锚定模式的开头
// 避免单词长度超过 $width 时疯狂的回溯
$search= '/(?<=\s|^)(.{1,'.$width.'}\S*)(?:\s)/uS';
$replace = '$1'.$break;
}
return
preg_replace($search, $replace, $string);
}
?>
16
Dave Lozier - dave at fusionbb.com
18 年前
如果您想断开长字符串的文本,但避免断开 html,您可能会发现这很有用。它似乎对我有用,希望它对您也有用。享受。:)

<?php
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;
}
?>
11
Alhadis
9 年前
对于那些有兴趣将文本包装到 *像素* 宽度(而不是字符)以适应宽度的人,您可能会发现以下函数有用; 尤其适用于在动态生成的图像上换行文本。

如果一个词太长而无法挤进可用空间,它会根据需要进行连字符,以使其适合容器。 这是递归操作,因此非常长的词或名称(例如,URL 或这个人的签名 - http://en.wikipedia.org/wiki/Wolfe+585,_Senior)仍然会继续被截断,一旦它们超过第四行或第五行,或任何其他行。

<?php

/**
* 将字符串包裹到指定像素宽度。
*
* 此函数类似于 PHP 原生的 wordwrap 函数;但是,它根据字体和字号进行计算,而不是字符计数。这
* 可以为包含大量细字符的句子生成更均匀的换行。
*
* @static $mult;
* @param string $text - 输入字符串。
* @param float $width - 文本换行区域的宽度,以像素为单位。
* @param float $size - 字体大小,以像素为单位。
* @param string $font - 用于测量文本的字体路径。
* @return string 包含手动插入的换行符的原始字符串,用于检测换行点。
*/
function pixel_word_wrap($text, $width, $size, $font){

# 传递了空值?提早退出。
if(!$text) return $text;

# 检查 imagettfbbox 是否期望字体大小以磅或像素声明。
static $mult;
$mult = $mult ?: version_compare(GD_VERSION, '2.0', '>=') ? .75 : 1;

# 文本已经适合指定的区域,无需换行。
$box = imagettfbbox($size * $mult, 0, $font, $text);
if(
$box[2] - $box[0] / $mult < $width) return $text;

# 开始测量输入的每一行并在检测到溢出时注入换行符。
$output = '';
$length = 0;

$words = preg_split('/\b(?=\S)|(?=\s)/', $text);
$word_count = count($words);
for(
$i = 0; $i < $word_count; ++$i){

# 换行符
if(PHP_EOL === $words[$i])
$length = 0;

# 剥离任何开头的制表符。
if(!$length) $words[$i] = preg_replace('/^\t+/', '', $words[$i]);

$box = imagettfbbox($size * $mult, 0, $font, $words[$i]);
$m = $box[2] - $box[0] / $mult;

# 这是一个很长的单词,所以尝试用连字符进行断字。
if(($diff = $width - $m) <= 0){
$diff = abs($diff);

# 确定从单词的哪一端开始测量。在已经很繁重的函数中节省了一些额外的周期。
if($diff - $width <= 0) for($s = strlen($words[$i]); $s; --$s){
$box = imagettfbbox($size * $mult, 0, $font, substr($words[$i], 0, $s) . '-');
if(
$width > ($box[2] - $box[0] / $mult) + $size){
$breakpoint = $s;
break;
}
}

else{
$word_length = strlen($words[$i]);
for(
$s = 0; $s < $word_length; ++$s){
$box = imagettfbbox($size * $mult, 0, $font, substr($words[$i], 0, $s+1) . '-');
if(
$width < ($box[2] - $box[0] / $mult) + $size){
$breakpoint = $s;
break;
}
}
}

if(
$breakpoint){
$w_l = substr($words[$i], 0, $s+1) . '-';
$w_r = substr($words[$i], $s+1);

$words[$i] = $w_l;
array_splice($words, $i+1, 0, $w_r);
++
$word_count;
$box = imagettfbbox($size * $mult, 0, $font, $w_l);
$m = $box[2] - $box[0] / $mult;
}
}

# 如果当前行没有足够的空间来容纳下一个单词,则开始新的一行。
if($length > 0 && $length + $m >= $width){
$output .= PHP_EOL;
$length = 0;

# 如果当前单词只是一个空格,就不要理会。跳过(节省了文本中的怪异间隙)。
if(' ' === $words[$i]) continue;
}

# 编写另一个单词并增加当前行的总长度。
$output .= $words[$i];
$length += $m;
}

return
$output;
};

?>
2
frans-jan at van-steenbeek dot R-E-M-O-V-E dot net
18 年前
使用 wordwrap 函数可以帮助格式化电子邮件,但它有一个缺点:换行符通常被视为空格,导致奇怪的行为,包括在只有一个单词后换行。

为了解决这个问题,我使用了以下方法:

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

然后我使用 linewrap() 函数代替 wordwrap() 函数

希望这能帮助到一些人
1
Peter
17 年前
当你在单元格中有一段文本时,最主要的顾虑是长单词会拖动单元格的边距。此函数会将文本中超过 $nr 个字符的单词使用“-”字符进行断字。

<?php
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);
}
?>
0
altin_bardhi at yahoo dot co dot uk
13 年前
我这里提供了一个可能非常有用的换行代码片段。

这段代码的作用是:它接受输入的文本,并查找长度超过定义的“$chunk_length”的单词,如果找到任何这样的单词,它会将长单词分割,然后将整个字符串连接回一个新的字符串,其中较长的单词用连字符分隔,在本例中为连字符。

完成此任务后,它将在指定的“$line_length”之后插入一个 HTML 换行符(取决于容器的宽度要求)。

<?php

// 开始函数 explode_wrap
function explode_wrap($text, $chunk_length, $line_length){

// 将所有由空格分隔的单词分解为一个字符串
$string_chunks = explode(' ', $text);

// 从数组 $sring_chunks_array => key => value 获取每个分割的单词
foreach ($string_chunks as $chunk => $value) {

if(
strlen($value) >= $chunk_length){

// 将比 $chunk_length 长的块/单词分割
$new_string_chunks[$chunk] = chunk_split($value, $chunk_length, ' - ');

}else {

// 不要分割正常长度的单词
$new_string_chunks[$chunk] = $value;

}

}
// 结束 foreach 循环

// 连接回所有单词
$new_text=implode(' ', $new_string_chunks);

return
wordwrap($new_text, $line_length, '<br />');

}
// 结束函数

?>
0
php at maranelda dot org
15 年前
任何尝试编写文本电子邮件客户端的人都应该注意以下几点

<?php

$a
= "some text that must wrap nice";

$a = wordwrap($a, 9);

echo
$a;

// some text
// that must
// wrap nice

$a = wordwrap($a, 9);

echo
$a;

// some text
// that
// must
// wrap
// nice

?>

对已经换行的文本再次使用 wordwrap() 将会考虑到换行符,因此将每行(例如)已正确换行的转发电子邮件,在第二次使用时,会将其视为长了一位字符。这在准备包含(例如)已经换行的转发电子邮件的文本电子邮件时会成为一个问题。

下面的解决方案在换行符上将文本分解,并分别对得到的字符串使用 wordwrap(),可以很好地解决这个问题。
0
$del=' at '; 'sanneschaap' dot $del dot 'gmail dot com'
16 年前
这些函数允许您将字符串换行,以与比例字体(在本例中为 Arial,11px)的实际显示宽度进行比较。在某些情况下非常方便,因为 CSS3 尚未完全支持。100 个字符串 = ~5 毫秒

我以前的老式绵羊换行函数(发布在本文档的底部,有点过时了),而这个函数更快,更准确。

<?php
// 最宽字符的宽度 @
$fontwidth = 11;

// 每个字符组包含具有相同比例显示宽度的字符序数
$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);

// 显示宽度与最大字符宽度的比较方式
$chargroup_relwidth[0] = 1; // 是字符 @
$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;

// 构建快速数组
$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];
}
}

// 获取字符串的显示宽度(以像素为单位)
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;
}

// 在特定显示像素宽度处截断字符串
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 是 10 点的原因规则:)
}
?>
-1
info at hsdn dot org
13 年前
支持 UTF-8 的自动换行,返回数组。

<?php

function mb_wordwrap_array($string, $width)
{
if ((
$len = mb_strlen($string, 'UTF-8')) <= $width)
{
return array(
$string);
}

$return = array();
$last_space = FALSE;
$i = 0;

do
{
if (
mb_substr($string, $i, 1, 'UTF-8') == ' ')
{
$last_space = $i;
}

if (
$i > $width)
{
$last_space = ($last_space == 0) ? $width : $last_space;

$return[] = trim(mb_substr($string, 0, $last_space, 'UTF-8'));
$string = mb_substr($string, $last_space, $len, 'UTF-8');
$len = mb_strlen($string, 'UTF-8');
$i = 0;
}

$i++;
}
while (
$i < $len);

$return[] = trim($string);

return
$return;
}

?>
-3
Marcin Dobruk [zuku3000 at yahoo dot co dot uk]
15 年前
从左到右(标准)和从右到左的自动换行。

<?php
function myWordWrap ($string, $length=3, $wrap=',', $from='left') {
if (
$from=='left') $txt=wordwrap($string, $length, $wrap, true);
if (
$from=='right') {
// 将字符串转换为数组
$arr_l=array();
for (
$a=0;strlen($string)>$a;$a++) $arr_l[$a]=$string{$a};
// 反转数组
$arr_r=array_reverse($arr_l);
// 数组转换为字符串
$string_r='';
foreach (
$arr_r as $arr_line => $arr) $string_r.=$arr;
// 在反转后的字符串中添加换行符
$string_r=wordwrap($string_r, $length, $wrap, true);
// 将反转后的字符串转换为数组
$arr_r=array();
for (
$a=0;strlen($string_r)>$a;$a++) $arr_r[]=$string_r{$a};
// 再次反转数组
$arr_l=array_reverse($arr_r);
// 带换行的字符串
$txt='';
foreach (
$arr_l as $arr_line => $arr) $txt.=$arr;
}
return
$txt;
}
?>
-4
maikuolan at gmail dot com
11 年前
(Re: kouber at php dot net)。

测试您的函数,我可以确认它有效,并且非常有效。

但是,打算使用您的函数的其他人需要注意,如果他们将您的函数与未经验证的数据(例如来自 $_POST、$_GET 等的原始用户输入)结合使用,他们就会创建潜在的攻击媒介,黑客可以通过包含恶意代码的脚本请求利用这些媒介。这是因为您的函数将 preg_replace 函数与“e”标志一起使用(为了允许 chunk_split 位执行),这可能允许执行任意代码。

解决方案:如果 $str 可能包含未经验证的数据(例如原始用户输入),请确保在将 $str 发送到 wrap($str,...) 之前对 $str 的内容进行清理(例如,使用 htmlentities/htmlspecialchars/等)。

不是批评;我打算使用您的函数,因为我喜欢它。但是,只是将其发布为对可能不知道数据清理重要性的其他用户的提示。
-3
ojs-hp at web dot de
14 年前
在我遇到了将 BB 文本转换为 HTML 的函数问题之后。长词并不真正适合布局,而且只有 wordwarp() 也在适合布局的词中添加了换行符,或者破坏了其他 HTML 标签....
所以这是我的解决方案。只有 strlen() >= 40 的词才会使用 wordwarp() 编辑。

<?php
function bb2html($bb) {
$words= explode(' ', $bb); // 将字符串转换为数组
foreach ($words as $word) {
$break = 0;
for (
$i = 0; $i < strlen($word); $i++) {
if (
$break >= 40) {
$word= wordwrap($word, 40, '-<br>', true); // 在每 40 个字符后添加 <br>
$break = 0;
}
$break++;

}
$newText[] = $word; // 将词添加到数组中
}
$bb = implode(' ', $newText); // 数组转换为字符串
return $bb;
}
?>
-3
kozimbek at mail dot ru
9 年前
在搜索了众多地方后,我厌倦了那些无法正常工作的 mb_wordwrap 函数,终于创造了一个真正简单且有效的解决方案

<?php
function mb_wordwrap($string, $limit)
{
$string = strip_tags($string); //去除文本中的HTML标签
$string = html_entity_decode($string); //将HTML特殊字符转换为普通文本
$string = str_replace(array("\r", "\n"), "", $string); //也去除换行符
if(mb_strlen($string, "UTF-8") <= $limit) return $string; //如果输入字符串的长度不超过切割长度,则返回未处理的字符串
$last_space = mb_strrpos(mb_substr($string, 0, $limit, "UTF-8"), " ", 0, "UTF-8"); //查找最后一个空格符号的位置

return mb_substr($string, 0, $last_space, "UTF-8").' ...'; //返回从字符串开头到最后一个空格的位置的子字符串,并在后面添加三个点
}
?>

该函数只是在指定的范围内搜索最后一个空格符号,并返回到该位置为止的字符串。没有迭代,没有正则表达式,也没有缓冲区过载。已用大量的俄语文本测试过,运行完美。
-3
phil_marmotte at yahoo dot fr
10 年前
另一个从左或右进行换行的函数

public static function myWordWrap ($string, $length=3, $wrap=',', $from='left') {
if ($from=='left') $txt=wordwrap($string, $length, $wrap, true);
if ($from=='right') {
$m = strlen($string)%$length;
if ($m < strlen($string))
$txt = substr($string,0,$m).$wrap.wordwrap(substr($string,$m),$length, $wrap, true);
else
$txt = $string;
}

return $txt;
}
-3
joachim
16 年前
在 Mac OSX 10.5.2 上,PHP 5.1 和 5.2 在 wordwrap 函数如何计算字符方面似乎存在差异。

/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
-3
tuxedobob
7 年前
需要注意的是,$break 参数的行为解释得很糟糕。

如果你指定了 $break 参数,那么 *该字符串定义了函数认为的“换行符”*。

考虑以下字符串

$str = "Rumplestiltskin Schwartzmenikoff
1534 Gingerbread Lane
Black Forest, Germany";

你想要将这个地址放到一个仅允许 22 个字符的空间里,但你想要让它清楚地显示你正在继续上一行,因此你想要添加一个空格。你可能会尝试这样操作

$str = wordwrap($str, 22, "\n>");

如果你这样做,你将得到以下输出

"Rumplestiltskin
>Schwartzmenikoff
1534
>Gingerbread Lane
Black
>Forest, Germany"

这是因为当你传入第三个参数 "\n>" 时,它假设整个字符串都是一个换行符。它不再使用 "\n"。当然,在你的输出中,\n 仍然是一个换行符,因此它看起来有额外的行。

如果你想用除了换行符以外的其他字符来换行一个多行字符串,确保所有现有的换行符已经用你传入 wordwrap() 的字符串分隔开。
-6
bruceboughton @ google mail
19 年前
我发现 wordwrap 会删除它换行的空格。如果你想换行一个不包含单词的字符串,你可能会发现这种行为不可取,就像我尝试将一个正则表达式换行到 80 个字符时一样(为了与测试字符串、匹配项等一起显示)。

为了保留空格并仍然实现一致的切割长度,你需要用一个合适的单字符替换来替换空格。我选择了 ASCII 非打印字符 SUB(ASCII #26;一些旧电话代码,意思是替换)

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

(当然,你需要用你的列长度替换 80,用你的换行符替换 '<br />')
-2
answers at clearcrescendo.com
5 年前
wordwrap() 使用换行符作为检测到的换行符和插入的换行符,因此在使用 wordwrap 之前,你的文本必须被标准化为你想要在 wordwrap() 输出中使用的换行符,否则你将得到插入的换行符,无论你的文本中现有换行符的位置如何。

<?php
$linebreak
= '<br/>' . PHP_EOL;
$width = 5;
$standardized = preg_replace('/\r?\n/',$linebreak, "abc abc abc\nabc abc abc\r\nabc abc abc");
echo
'Standardized EOL:', PHP_EOL, $standardized, PHP_EOL, PHP_EOL; // PHP_EOL 用于命令行,使用 '<br/>' 用于 HTML。
echo "Wrapped at $width:", PHP_EOL, wordwrap( $standardized, 7, $linebreak), PHP_EOL;
?>

$ php -f test.php
Standardized EOL
abc abc abc<br/>
abc abc abc<br/>
abc abc abc

Wrapped at 5
abc abc<br/>
abc<br/>
abc abc<br/>
abc<br/>
abc abc<br/>
abc
-4
zac dot hester at gmail dot com
9 年前
我最近遇到了另一个贡献者(frans-jan at van-steenbeek dot R-E-M-O-V-E dot net)讨论的问题。问题似乎是 wordwrap() 如何处理空白。我没有编写我自己的 wordwrap() 版本,而是发现“break”参数不仅用作插入的字符串,还用作检测现有换行符(例如行尾)。如果你能设法在原始字符串中“规范化”换行符,你就不需要尝试绕过函数在看似奇怪的位置进行换行(比如紧跟在一个短词后面)。作为一种快速而简单的处理 wordwrap() 的大多数用例的方法,我这样做了

<?php
$break
= strpos( $content, "\r" ) === false ? "\n" : "\r\n";
$content = wordwrap( $content, 78, $break );
?>

我也倾向于规范化多行字符串(如果我的强迫症发作了)。你通常会在将它发送到 wordwrap() 之前执行此转换。

<?php
//快速简单,但会覆盖旧式的 Mac 行尾
$content = str_replace( "\r", '', $content );

//速度较慢,但可以处理所有情况
$content = preg_replace( "/(\r\n|\r)/", "\n", $content );

//现在,wordwrap() 将按预期工作
$content = wordwrap( $content, 78, "\n" );
?>
-9
nbenitezl[arroba]gmail[dot]com
13 年前
嗨,这个函数就像 wordwrap 一样,但它会忽略 HTML 标签,当使用第四个参数为 true 时,它的行为与 wordwrap 相同。它基于我在此找到的函数,但进行了改进,以更接近 wordwrap 的输出(即,删除行首的空格),并提高了性能。

希望它对你有所帮助 :-)
<?php
function htmlwrap(&$str, $maxLength, $char='<br />'){
$count = 0;
$newStr = '';
$openTag = false;
$lenstr = strlen($str);
for(
$i=0; $i<$lenstr; $i++){
$newStr .= $str{$i};
if(
$str{$i} == '<'){
$openTag = true;
continue;
}
if((
$openTag) && ($str{$i} == '>')){
$openTag = false;
continue;
}
if(!
$openTag){
if(
$str{$i} == ' '){
if (
$count == 0) {
$newStr = substr($newStr,0, -1);
continue;
} else {
$lastspace = $count + 1;
}
}
$count++;
if(
$count==$maxLength){
if (
$str{$i+1} != ' ' && $lastspace && ($lastspace < $count)) {
$tmp = ($count - $lastspace)* -1;
$newStr = substr($newStr,0, $tmp) . $char . substr($newStr,$tmp);
$count = $tmp * -1;
} else {
$newStr .= $char;
$count = 0;
}
$lastspace = 0;
}
}
}

return
$newStr;
}
?>
-15
Matt at newbiewebdevelopment dot idk
15 年前
我的多字节自动换行版本

<?php
function mb_wordwrap($string, $width=75, $break="\n", $cut = false) {
if (!
$cut) {
$regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.',}\b#U';
} else {
$regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.'}#';
}
$string_length = mb_strlen($string,'UTF-8');
$cut_length = ceil($string_length / $width);
$i = 1;
$return = '';
while (
$i < $cut_length) {
preg_match($regexp, $string,$matches);
$new_string = $matches[0];
$return .= $new_string.$break;
$string = substr($string, strlen($new_string));
$i++;
}
return
$return.$string;
}

$mb_string = "こんにちは";//Hello in Japanese
$cut_mb_string = mb_wordwrap($mb_string,1," ",true); //こ ん に ち は
print($cut_mb_string);
?>
-5
simbiat at bk dot ru
7 年前
有些人使用 wordwrap 作为长文本切割器。我对此有略微不同的方法。该函数不会换行文本,而是返回切割位置。它保留了 HTML 标签(不计算它们)并去除尾部的 br 标签和空格。我正在研究一种方法来防止 HTML 标签损坏,这可能会在此时发生,还支持像 code 和 quote 这样的 BB 标签,这样它们也不会被计算。当我完成时,我会发布更新后的代码版本。

<?php
function txtcut($string, $length) {
$tag = false;
$chars = 0;
$position = 0;
$split = str_split($string);
foreach (
$split as $char) {
$position++;
if (
$char == "<") {
$tag = true;
continue;
}
if (
$char == ">") {
$tag = false;
continue;
}
if (
$tag == true) {
continue;
}
$chars++;
if (
$chars >= $length) {
if (
$char == " " || $char == "\r" || $char == "\n") {
$position--;
break;
}
}
}
if (
$position == strlen($string)) {
return
strlen($string);
} else {
$string = substr($string, 0, $position);
if (
substr($string, -4, 4) == "<br>") {
$string = rtrim(substr($string, 0, -4));
}
return
strlen($string);
}
}
?>
To Top