【PHP】正規表現で文字数をカウントして強制的に改行させる

これも覚書き。

テーブルのtdの中などで文字数で幅を決めたいとき、隣接するtdセルやテーブル全体の幅の影響なども受けるためCSSのwidth設定などでは強制的に決めちゃうことができない。

出力したいtdの中の値に例えば10文字ごとに”<br>”タグを挟み込んでよい場合には、正規表現で文字列を置換してしまうpreg_replace関数を使えばいいってことで、例えば10文字ごとに改行させたい場合には

パターン: /(.{10})/i 置換文字列: $1 <br>

$txt = "aaaaabbbbbcccccdddddeeeeefffff";//元のテキストデータ
$ptn = "/(.{10})/i";
$rep = "$1 <br>";
$txt-rep = preg_replace($ptn,$rep,$txt);

echo $txt-rep;//結果出力

上記のようにして置換後のテキストを表示させると、 aaaaabbbbb<br> cccccddddd<br> eeeeefffff<br> のように10文字ごとに改行タグをつけて出力してくれるので、white-space:nowrapをCSSで指定したセルに表示させれば望んだ状態で強制的に改行表示させることができます。

でも、この文字列の中に日本語の全角文字(マルチバイト文字)が含まれていると、正しく表示されずに、”?”(黒四角の中にクエスチョンみたいなヘンなエラー値)のようなエラー値を含んだ値になったり空白になってしまったりと予想外の値が表示されてしまいます。

これは正規表現の上記のカウント数はあくまでも半角ベースで数えられてるため。

なので、日本語などのマルチバイト文字も含むテキストデータで文字数を指定する場合にはパターン修飾子を正しく指定しなおす必要があります。

で、この場合の正しいパターン修飾子はエンコードutf-8を示す”u”を付記すればよいということで、

$txt = "aaaaabbbbbcccccdddddeeeeefffff";//元のテキストデータ
$ptn = "/(.{10})/u";//ここでパターン修飾子にuを指定
$rep = "$1 <br>";
$txt-rep = preg_replace($ptn,$rep,$txt);

echo $txt-rep;//結果出力

…のように指定すれば半角、全角混在してても10文字目できっちりと切り分けてくれます♪

参考URL:

■[自分用メモ]正規表現を使ってn文字ごとに改行する。 [PHP]preg_matchの正規表現の中で日本語(マルチバイト文字)を使う

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA