PHPで文字列を扱うための4つの方法

2014年8月29日(金)
野田 貴子

まとめ

これらの文字列の書き方を表にまとめてみました。

echoするもの実行結果
シングルクォートダブルクォートヒアドキュメントNowdoc
'エラー'''
\''\'\'\'
""エラー""
\"\""\"\"
\\\\\\\
\n\n\n
\t\t\t
\$100\$100$100$100\$100
$hello$helloこんにちはこんにちは$hello

いろいろな書き方があって、どれを使っていいか分からない!と悩んでしまう方もいるかもしれませんね。その場合は、以下のいずれかにルールを決めるといいと思います。

  • 常にシングルクォートを使う。改行や変数は、連結演算子を使って書く。
  • 常にダブルクォートを使う。改行や変数も書き放題。
  • 必要なときのみダブルクォートを使い、そうでないときはシングルクォートで書く。

どのようなルールにするにせよ、書き方のルールを作っておくと、後々とても重宝すると思いますよ。

文字列の操作

文字列の表し方については大体お分かりいただけたかと思います。次は文字列を操作する方法です。操作と言うと分かりにくいかもしれませんが、文字列にちょっとした変更を加えることです。一般的なユーザー登録画面を考えてみましょう。

図1: 一般的なユーザー登録画面

入力欄に入力してもらったユーザーIDをデータベースに保存して、今後のログイン処理で使うことにします。入力してもらったIDをそのまま保存してしまうと使いにくいので、次のような処理をしてみましょう。

  1. 前後の空白は取り除く
  2. 11文字以上はエラーにする
  3. 小文字に変換する
  4. 「admin」というIDはエラーにする
  5. 1文字目が「a」でないIDはエラーにする

1. 前後の空白を取り除く

入力欄で間違えて空白を混入してしまう人もいるかもしれません。そういう時に「空白を削除してください」というエラーを出すよりも、自動的に空白を取り除いてあげた方がスマートですよね。trim関数で、文字列の前後の空白を取り除くことができます。

    // (1) 変数にIDを入れる(入力欄で入力してもらったつもりで!)
    $inputId = '     nogunogu  ';

    // (2) 前後の空白を取り除いた結果を、別の変数に入れる
    $trimId = <span style="color:red;">trim($inputId)</span>;

    echo "あなたのIDは「$trimId」です。\n";

<実行結果>

    あなたのIDは「nogunogu」です。

2. 11文字以上はエラーにする

IDは半角10文字以内という決まりを作り、11文字以上のIDが入力されたら入力エラーにしましょう。HTMLの入力欄で11文字以上入力できないようにもできますが(たとえばinput要素にmaxlength要素を指定したり、JavaScriptを使うなど)、その制限を解除できる人もいるので、PHPでも入力された文字列の長さのチェックが必要です。

strlen関数で、文字列の長さを取得することができます。

[※] 正確には文字数ではなくバイト数を取得します。PHPでは半角文字は1文字1バイトなので、半角文字列のバイト数は、文字数と同値になります。

    // (1) 変数にIDを入れる(入力欄で入力してもらったつもりで!)
    $inputId = '     longnogunogu  ';

    // (2) 前後の空白を取り除いた結果を、別の変数に入れる
    $trimId = trim($inputId);

    // (3) 文字列の長さを取得し、変数に入れる
    $length = <span style="color:red;">strlen($trimId)</span>;

    // (4) 11文字以上の場合
    if ($length >= 11) {  
      // エラー文を表示する
      echo "あなたのIDは $length 文字で、長すぎです。\n";
    }

if はコードの中で条件分岐をする構文です。() 内の条件に一致した場合のみ、{} 内の行が実行されます。「以上」は「>=」、「より大きい」は「>」を使います。この場合「longnogunogu」は12文字なので、エラー文が表示されます。

<実行結果>

    あなたのIDは「longnogunogu」です。
    あなたのIDは 12 文字で、長すぎです。

(2)と(3)はまとめて書くことができます。

    // (2)(3) 前後の空白を取り除いた結果の長さを取得し、変数に入れる
    $length = <span style="color:red;">strlen(trim($inputId))</span>;

さらに(4)もまとめて書くことができます。

    // (2)(3)(4) 前後の空白を取り除いた結果の長さを取得し、11文字以上ならエラーを表示する
    <span style="color:red;">if (strlen(trim($inputId)) >= 11)</span> {
      echo "あなたのIDは $length 文字で、長すぎです。\n";
    }

ただし、まとめてしまうと変数 $trimId が使えないので、ここでは、まとめずに書くことにします。

3. 小文字に変換する

管理をしやすくするため、IDは小文字限定にしましょう。ただし、大文字を入力されてもエラーにはしないで、PHPで自動的に小文字に変換することにします。

strtolower関数で、文字列のアルファベット部分を小文字に変換することができます。「str(string=文字列)to(~へ)lower(小)」というネーミングです。

    // (1) 変数にIDを入れる(入力欄で入力してもらったつもりで!)
    $inputId = '<span style="color:red;">     NogunogU  </span>';

    // (2) 前後の空白を取り除いた結果を、別の変数に入れる
    $trimId = trim($inputId);

    echo "あなたのIDは「$trimId」です。\n";

    // (3) 文字列の長さを取得し、変数に入れる
    $length = strlen($trimId);

    // (4) 11文字以上の場合
    if ($length >= 11) {
      // エラー文を表示する
      echo "あなたのIDは $length 文字で、長すぎです。\n";
    }

    // (5) IDを小文字に変換した結果を、別の変数に入れる
    $lowerId = <span style="color:red;">strtolower($trimId)</span>;

    echo "あなたのIDは「$lowerId」です。\n";

<実行結果>

    あなたのIDは「nogunogu」です。

もちろん大文字に変換する関数もありますよ。あまり出番はありませんが、strtoupperです。

4. 「admin」というIDはエラーにする

IDの禁止ワードを用意してみましょう。「admin」というIDは登録できないようにします。

strcasecmp関数は2つの文字列を大文字小文字の区別なしで比較し、等しいときは 0 を返します。「str(string=文字列)case(大文字小文字)cmp(compare=比較)」というネーミングです。

    // (1) 変数にIDを入れる(入力欄で入力してもらったつもりで!)
    $inputId = '<span style="color:red;">     Admin  </span>';

    // (2) 前後の空白を取り除いた結果を、別の変数に入れる
    $trimId = trim($inputId);

    // (3) 文字列の長さを取得し、変数に入れる
    $length = strlen($trimId);

    // (4) 11文字以上の場合
    if ($length >= 11) {
      // エラー文を表示する
      echo "あなたのIDは $length 文字で、長すぎです。\n";
    }

    // (5) IDがadmin(大文字小文字は区別しない)の場合
    if (<span style="color:red;">strcasecmp($trimId, 'admin')</span> === 0) {
      // エラー文を表示する
      echo "IDに「admin」を使うことはできません。\n";
    }

    // (6) IDを小文字に変換した結果を、別の変数に入れる
    $lowerId = strtolower($trimId);

    echo "あなたのIDは「$lowerId」です。\n";

<実行結果>

    IDに「admin」を使うことはできません。
    あなたのIDは「admin」です。

5. 1文字目が「a」でないIDはエラーにする

IDの1文字目は「a」にするという決まりを作ってみましょう。substr関数は、文字列の中の指定した位置に当てはまる文字列を教えてくれます。substr(文字列, スタート位置, 取得バイト数) と書きます。スタート位置は 0 から数えます。substr は substring(従属文字列)の略です。

    // (1) 変数にIDを入れる(入力欄で入力してもらったつもりで!)
    $inputId = '     nogunogu  ';

    // (2) 前後の空白を取り除いた結果を、別の変数に入れる
    $trimId = trim($inputId);

    // (3) 文字列の長さを取得し、変数に入れる
    $length = strlen($trimId);

    // (4) 11文字以上の場合
    if ($length >= 11) {
      // エラー文を表示する
      echo "あなたのIDは $length 文字で、長すぎです。\n";
    }

    // (5) IDがadmin(大文字小文字は区別しない)の場合
    if (strcasecmp($trimId, 'admin') === 0) {
      // エラー文を表示する
      echo "IDに「admin」を使うことはできません。\n";
    }

    // (6) IDを小文字に変換した結果を、別の変数に入れる
    $lowerId = strtolower($trimId);

    // (7) IDの先頭1文字を取得し、別の変数に入れる
    $firstLetter = <span style="color:red;">substr($lowerId, 0, 1)</span>;

    // (8) 取得した文字が「a」でない場合
    if ($firstLetter !== 'a') {
      // エラー文を表示する
      echo "IDは「a」から始めてください。\n";
    }

    echo "あなたのIDは「$lowerId」です。\n";

<実行結果>

    IDは「a」から始めてください。
    あなたのIDは「nogunogu」です。

以上でIDに対する文字列操作はおしまいです。ここに出た例はほんの一部ですし、開発者から見たらリアリティがなかったり、簡略化しすぎたりしているものもあります。ですが、IDひとつを取っても、裏ではいろいろな文字列の操作をしていることが、何となくお分かりいただけたでしょうか。

今回は、文字列がどのようなものか、そして簡単な文字列の操作についてお話しました。次回はもっと複雑な文字列の操作と、数値について取り上げたいと思います。

それではまた~。よい開発ライフを!

1983年生まれ。大学卒業後、ソフトウェア開発の営業を経て、ソフトウェア開発業務に転向。現在は自社パッケージのフロントエンド開発のほか、PHPでの受託開発案件、日→英のローカライズ案件などを担当。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています