PHPで文字列折り返し (シンプル版と参考)

禁則処理つきはこちら。

組み込み関数 mb_strimwidth を使ってシンプルに。欧文の単語の途中でもずばっと分割しちゃいます。

<?php
function ja_wordwrap($string, $n, $break = "\n")
{
    $a = array();
    $lines = explode("\n", $string);
    foreach ($lines as $line) {
        $len = mb_strlen($line);
        if ($len == 0) {
            $a[] = '';
        }
        $p = 0;
        while ($p < $len) {
            $t = mb_strimwidth($line, $p, $n);
            $a[] = $t;
            $p += mb_strlen($t);
        }
    }
    return implode($break, $a);
}

参考

折り返し→禁則処理→実体参照やURLが分割されるのを防ぐ、とやっています。
前掲の記事の ja_wordwrap_token で実体参照やURLを一つのトークンとするようにし、mb_strwidth も実体参照を考慮したものにするとこれと同等、あるいは実体参照の幅のぶん精度の高いものができます。今回は必要ないのでやっていない。