正規表現を使用して文字列を反復処理し、指定された文字数の後に改行を挿入する関数をWebで見つけたので、固定幅の狭いテーブルセルに収まります。ここに関数があります:
/**
* wordwrap for utf8 encoded strings
*
* @param string $str
* @param integer $len
* @param string $what
* @return string
* @author Milian Wolff <mail@milianw.de>
*/
function utf8_wordwrap($str, $width, $break, $cut = false) {
if (!$cut || $_SESSION['wordwrap']) {
$regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.'}#';
} else {
return $str; //if no wordwrap turned on, returns the original string
}
if (function_exists('mb_strlen')) {
$str_len = mb_strlen($str,'UTF-8');
} else {
$str_len = preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty);
}
$while_what = ceil($str_len / $width);
$i = 1;
$return = '';
while ($i < $while_what) {
preg_match($regexp, $str,$matches);
$string = $matches[0];
$return .= $string.$break;
$str = substr($str, strlen($string));
$i++;
}
return $return.$str;
}
ここに正規表現があります:
#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){20}#
文字列に改行文字が含まれるまで while ループと組み合わせると、うまく機能します。
文字列の例:
1. first
2. second
3. third
prag_match の出力:
array (
0 => '1. first
2. second
3',
)
したがって、20 番目の文字を数えて、それを返します。
私が必要とするのは、改行文字 (\n) まですべてを返すようにするか、何もない場合は最初の 20 文字を返すことです。したがって、この場合の出力は次のようになります。
array (
0 => '1. first',
1 => '2. second',
2 => '3. third'
)
更新: Steve Robbinsの答えを試してみましたが、文字列に仕様のUTF-8文字が含まれるまで、完全に機能しました。そもそもまともな例を提供しなかったのは私のせいです。これが何をするかです:
<?php
header('Content-type: text/html; charset=UTF-8');
$input = '1. first
2. second
3. third
ez eg nyoulőűúúú3456789öüö987654323456789öü
pam
param';
$output = array();
foreach (explode("\n", $input) as $value) {
foreach (str_split($value, 20) as $v) {
$trimmed = trim($v);
if (!empty($trimmed))
$output[] = $trimmed;
}
}
var_dump($output);
出力は次のとおりです。
array(8) {
[0]=>
string(8) "1. first"
[1]=>
string(9) "2. second"
[2]=>
string(8) "3. third"
[3]=>
string(20) "ez eg nyoulőűúú�"
[4]=>
string(20) "�3456789öüö987654"
[5]=>
string(13) "323456789öü"
[6]=>
string(3) "pam"
[7]=>
string(5) "papam"
}