[PHP] 文字長がnバイト以下になるまで末尾の文字を1字づつカット

公開

スポンサーリンク

WordPressのURLスラッグは、”wp_posts”テーブルの”post_name”カラムに保存されます。post_nameの構造はvarchar(200)ですから、シングルバイト文字は200字まで使えますが、マルチバイト文字は22字までしか使えません。マルチバイト文字はURLエンコードされた上で保存されますから、1文字が3バイトでそれが3桁、つまり1字あたり9バイトが保存に必要なスペースとなります。200 / 9 = 22.222….ということで22字です。もし日本語URLを使っている場合、22字は頻繁にオーバーしてしまう字数です。

普通に使っている場合、WordPress側が上手く扱ってくれるので、スラッグの字数のことを気にする必要はありません。しかし、WordPress外部から日本語の単語にもとづきWordPressサイトへのリンクを作成する際には、字数を調整していかねばなりません。

さて、この単語は英数字も混じるのですが、英数字は半角のため、保存時のバイト数は1バイトです。つまり、日本語だけで23字なら末尾の1文字はカットされてしまいますが、日本語22字+半角2字の文字列なら、バイト数は200となりそのまま保存されるということになります。ということは、単純に文字数で判定し、22字以上なら末尾をカットではダメということです。

そこで、URLエンコードした後の文字長が200バイト以下になるまで末尾から1字づつカットするコードを書くことにしました。

$slug = "日本語とalphabetが混じった文字列";
while ( strlen(urlencode($slug)) > 200 )//URLエンコード後の文字長が200バイト以下になるまでループ
  $slug = mb_substr($slug, 0, -1);//末尾の1字をカット

判定はバイトで行い、カットは字数で行ったわけですね。WordPress内部も同じようなコードじゃないかと思います。

書いてみれば簡単なコードで、覚書を残すまでもないような気もしますが、初めに用途が必要になった時にしばらく考えこんでしまったのでメモを残しておくことにします。

スポンサーリンク

PHPカテゴリーの投稿

» PHPカテゴリーの記事をもっと見る

WordPressカテゴリーの投稿

» WordPressカテゴリーの記事をもっと見る


Comment