目次

文字列の長さをはかる。

入力フォームのタイトルに例えば、「タイトルを入力してください。50バイトまで」と表記したところで、初心者はバイトって何?と思われてしまう。 UTF-8な環境が主流になりつつ現在、入力された文字の長さを測ることは困難であるが、それでもエラー対応をするためにある程度は文字入力の制限をしなければならない。

http://yanok.net/2012/08/post-226.html を見ると、文字数制限のやっかいさについて書かれているが今回はphpで実装されている文字のカウントについてまとめてみる。

  • strlen(バイト数)
  • mb_strlen(文字数)
  • mb_strwidth(文字幅) このように3つ種類がある。これをまとめると、
  1. strlen(バイト数)・・・データベース向き?開発者向き?
    文字のバイト数を計算するもの。UTF-8の場合、半角英数字は1バイト、全角ひらがなや漢字は3バイト。
  2. mb_strlen(文字数)・・・ユーザ向き?
    文字数をカウントするもの。ユーザ向きかもしれない。
  3. strwidth(文字幅)・・・webデザイナー向き? 文字の幅をカウントするもの。表示の綺麗さを気にするwebデザイナー向きかもしれない。そして文字の幅はこう決まっている
    文字
    U+0000 - U+0019 0
    U+0020 - U+1FFF 1
    U+2000 - U+FF60 2
    U+FF61 - U+FF9F 1
    U+FFA0 - 2

さて、どれを使えば理想かというと、ユーザ視点で考えれば、2か3かもしれない。1は多めにデータベースの型のカラムをとっておけば対応できる。 と思って2や3のみで対応すると、改行をたくさん入れられた際に文字数0、バイト数(7行であれば14)バイトとでてしまい、データベースの型のフィールドにうまく収まらない可能性がある。ということで入力チェックを1と2で対応するのがよく3はあまり使わない・・・カモ。そんなコードをあまり見たことがない・・・。

<?php
$hoge = $_POST["hoge"];

$error = '';
if(strlen($hoge) > 255) $error .= '255バイトを超えています。<br>';/*textarea等に使用*/
if(mb_strlen($hoge) > 60) $error .= '60文字以内にしてください<br>';
if(mb_strwidth($hoge) > 40) $error .= 'もう少し幅を小さくしてください?<br>';/*これあんまり使わない*/

print $error;
if($error == ''){
 処理プログラム。
}

?>






名前:
コメント:

文字をエスケープ処理する。htmlspecialchars

 特殊文字をHTMLエンティティに変換する関数。主に一般ユーザのJavascript埋め込みを防ぐのに使われる。XSS対策。
使い方は以下。

print htmlspecialchars($hoge, ENT_QUOTES);

よく使う関数であるので毎回htmlspecialcharsと書くのはめんどくさい。 そこで関数を作ってあげて、簡単に記述させる。

function h($str){
   return htmlspecialchars($str,ENT_QUOTES,"UTF-8");
}

これを指定しておけば楽に記述することができる。

GETメソッドのフィルター(要編集)

GETメソッド時、数字しか処理できいないようにする。

$a = filter_input(INPUT_GET, 'aaa', FILTER_SANITIZE_NUMBER_INT);

FILTER_SANITIZE_NUMBER_INTは数字、プラス記号、マイナス記号 以外のすべての文字を取り除く。

最終更新:2015年04月30日 11:53