1

正規表現を使用して文字列を反復処理し、指定された文字数の後に改行を挿入する関数を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"
}

http://codepad.org/Gt4CshXt

4

2 に答える 2