PHP
マルチバイト文字

マルチバイト対応かつ改行を含む文字列対応のwordwrap()を作成した


注意

下記コードでは絵文字・濁点を含んだ場合に想定どおりの動作をしません。コメントをご参照ください。

@tadsan 様ご指摘ありがとうございます。


背景

あまり無い要件かもしれませんが、テキストエリアに入力された文字列を規定の文字数で改行し、なおかつ改行がされているのを保持するために作成しました。

public function mb_wordwrap(String $str, int $width = 50, String $break = "\n" ):String

{
// 改行コードを統一
$str = preg_replace("/\r\n|\r|\n/", $break, $str);
// 既存の改行単位で分割
$orgArr = explode("\n", $str);
$wrapped = [];

// 分割した中で規定の文字数を超える場合は改行をはさむ
foreach ($orgArr as $s) {
$w = mb_strlen($s, "UTF-8");
$arr = [];
for($i = 0; $i < $w; $i+=$width){
$arr[] = mb_substr($s, $i, $width, "UTF-8");
}

$wrappedStr[] = implode($break, $arr);
}

// 最後に配列から文字列に戻して終わり
return implode($break, $wrappedStr);
}

内容の間違い、説明の仕方、誤字脱字含めご指摘いただければ幸いです。