こんにちは、かつコーチです。
前回は require と include の違いを解説しました。
今回は、PHPでファイルを読み込んで処理を組み立てていくうえで避けて通れない、文字列操作の関数をまとめて解説します。
会員登録フォームの入力チェック、検索機能、表示用のテキスト整形など、実務では文字列を扱う場面が本当に多いです。
「なんとなく動いているけど、正確な仕様は知らない」という人も多い関数ばかりなので、この機会にしっかり整理しておきましょう。
文字列操作関数を学ぶ意味
なぜ文字列関数が重要なのか
Webアプリケーションで扱うデータの多くは、最終的に「文字列」として届きます。
フォームに入力された名前、URLのパラメータ、データベースから取得した値、これらはすべて文字列として扱われることがほとんどです。
その文字列を「何文字か調べる」「一部分だけ取り出す」「特定の文字を置き換える」といった操作は、実務のあらゆる場面で登場します。
私が新人の頃、この文字列関数の仕様を正確に把握していなかったせいで、思わぬバグを埋め込んでしまったことがあります。
その具体例も含めて、代表的な関数を1つずつ見ていきましょう。
この記事で扱う関数
今回は特に使用頻度が高い、次の3系統を中心に解説します。
- 文字数を調べる
strlen - 一部分を取り出す
substr - 文字を置き換える
str_replace
あわせて、実務でよく組み合わせて使う関数もいくつか紹介します。
文字数を調べる:strlen
基本の書き方
文字列の長さ(バイト数)を調べるには strlen() を使います。
<?php
$name = "かつコーチ";
echo strlen($name);
// 出力: 15
「え、5文字なのに15?」と思った人もいるかもしれません。
ここが strlen() の最初のつまずきポイントです。
つまずきポイント:マルチバイト文字の落とし穴
strlen() は文字数ではなくバイト数を返す関数です。
日本語の文字(マルチバイト文字)はUTF-8の場合、1文字あたり3バイトで計算されるため、5文字の「かつコーチ」は15バイトになります。
❌ Before:日本語の文字数チェックに strlen を使う
<?php
$nickname = "かつコーチ"; // 5文字のつもり
if (strlen($nickname) <= 10) {
echo "10文字以内です"; // バイト数で判定してしまい、意図と食い違う
}
// 「かつコーチ」は15バイトなので、この条件は成立しない
このコードでは、見た目は5文字なのに strlen() が15を返すため、「10文字以内」という条件に引っかかってしまいます。
私が実際にこのミスをやったのは、ユーザー名の文字数制限機能を作っていたときでした。
日本語名を入力すると、想定より少ない文字数ですぐに「文字数オーバーです」と表示されてしまい、テストユーザーから「バグってませんか」と報告を受けて初めて気づいたという苦い記憶があります。
✅ After:日本語を含む文字数は mb_strlen を使う
<?php
$nickname = "かつコーチ"; // 5文字
if (mb_strlen($nickname) <= 10) {
echo "10文字以内です"; // 文字数(5)で正しく判定される
}
mb_strlen() は「マルチバイト対応版」の文字数カウント関数で、見た目通りの文字数を返してくれます。
日本語を扱う可能性がある場面では、strlen() ではなく mb_strlen() を使うのが鉄則です。
英数字だけを扱う場面(パスワードのバイト数チェックなど)では strlen() のままで問題ありません。
一部分を取り出す:substr
基本の書き方
文字列の一部分だけを取り出したいときは substr() を使います。
<?php
$text = "Hello, PHP World!";
echo substr($text, 0, 5);
// 出力: Hello
substr(対象の文字列, 開始位置, 取得する文字数) という並びで指定します。
開始位置は0から数える点に注意してください。
マイナス値で「後ろから」指定する
substr() は開始位置にマイナスの値を指定すると、文字列の末尾から数えて取り出すこともできます。
<?php
$text = "Hello, PHP World!";
echo substr($text, -6);
// 出力: World!
「後ろから6文字」を取り出しているイメージです。
ファイルの拡張子だけ取り出したいときなどによく使うテクニックです。
<?php
$fileName = "report.pdf";
$extension = substr($fileName, -3);
echo $extension;
// 出力: pdf
日本語を扱うときは mb_substr
strlen() と同じ理由で、日本語を含む文字列を切り出す場合は mb_substr() を使います。
<?php
$text = "かつコーチの技術ブログ";
echo mb_substr($text, 0, 5);
// 出力: かつコーチ
substr() を日本語に使うと、文字の途中でバイト単位に切られてしまい、文字化けの原因になります。
「一覧ページで本文を◯文字だけ抜粋して表示する」といった機能を作るときは、必ず mb_substr() を使いましょう。
文字を置き換える:str_replace
基本の書き方
文字列の中の特定の文字を、別の文字に置き換えるには str_replace() を使います。
<?php
$text = "PHPは初心者にやさしい言語です。";
$newText = str_replace("初心者", "プログラミング初心者", $text);
echo $newText;
// 出力: PHPはプログラミング初心者にやさしい言語です。
str_replace(検索する文字, 置き換える文字, 対象の文字列) という並びで指定します。
複数の置き換えを一気に行う
配列を使えば、複数のパターンを一度に置き換えることもできます。
<?php
$text = "1月 2月 3月";
$search = ["1月", "2月", "3月"];
$replace = ["January", "February", "March"];
echo str_replace($search, $replace, $text);
// 出力: January February March
配列の順番を対応させておけば、それぞれが正しく置き換わります。
大文字・小文字を区別したくない場合
str_replace() は大文字・小文字を区別する関数です。
区別せずに置き換えたい場合は str_ireplace() を使います。
<?php
$text = "Welcome to PHP World";
echo str_ireplace("php", "PHP", $text);
// 出力: Welcome to PHP World
"php"(小文字)で検索していますが、"PHP" の部分も大文字・小文字を無視して置き換えられています。
組み合わせてよく使う関数
前後の空白を消す trim
フォームの入力値には、意図せず前後に空白が入っていることがよくあります。
<?php
$email = " taro@example.com ";
$cleanEmail = trim($email);
echo "[" . $cleanEmail . "]";
// 出力: [taro@example.com]
trim() は文字列の前後の空白(改行やタブも含む)を取り除いてくれます。
メールアドレスの照合など、完全一致が必要な処理の前には必ず trim() を通す習慣をつけておくと安心です。
大文字・小文字を変換する strtoupper / strtolower
<?php
$code = "abc123";
echo strtoupper($code); // 出力: ABC123
echo strtolower("XYZ789"); // 出力: xyz789
クーポンコードの照合や、メールアドレスの正規化(小文字に統一して重複登録を防ぐ)などでよく使われます。
文字列を分割する explode
CSVのような「区切り文字」で区切られた文字列を配列に分割したいときは explode() を使います。
<?php
$csv = "田中,佐藤,鈴木";
$names = explode(",", $csv);
print_r($names);
// 出力:
// Array
// (
// [0] => 田中
// [1] => 佐藤
// [2] => 鈴木
// )
反対に、配列を1つの文字列にまとめたいときは implode() を使います。
<?php
$names = ["田中", "佐藤", "鈴木"];
echo implode(", ", $names);
// 出力: 田中, 佐藤, 鈴木
この explode と implode のペアは、CSVの取り込みや一覧表示の整形など、実務で本当によく使う組み合わせです。
まとめ
この記事のポイント
strlen()はバイト数、mb_strlen()は文字数を返す。日本語を扱うならmb_系を使うsubstr()で部分文字列を取り出せる。日本語の場合はmb_substr()を使うstr_replace()で文字の置き換え、配列を使えば複数パターンを一括処理できるtrim()・strtoupper()・strtolower()は入力値の整形でよく使うexplode()とimplode()は文字列⇔配列の変換によく使うペア
次に読むべき記事
文字列操作ができるようになったら、次は日付や時刻を扱う DateTime クラスを見ていきましょう。
→ 次の記事:PHPで日付・時刻を扱う:DateTimeクラスの基本