PHPはサーバーサイド開発で広く使われている言語ですが、文字列(テキスト)の扱い方を正しく理解していないと、思わぬバグや文字化けが起こることがあります。この記事では、初心者の方でも段階的に学べるように、PHPでテキストを扱う基本的な方法から、安全に文字列を扱うためのポイントまで、丁寧に解説していきます。すべてのセクションには、実際に動かせるコード例を用意しているので、ぜひ手元で試しながら読み進めてみてください。
PHPで文字列を扱う基本①:2種類のクォーテーション
PHPの文字列はシングルクォーテーションとダブルクォーテーションの 2 種類で定義できます。ダブルクォーテーション内では変数展開が可能なため、用途に応じて使い分けることが重要です。また、ヒアドキュメントやナウドキュメントを活用すれば複数行のテンプレートも簡潔に扱えます。
<?php
$name = 'Taro';
echo "こんにちは、{$name}さん\n";
// 変数展開が行われる⇒「こんにちは、Taroさん」
echo 'こんにちは、$nameさん\n';
// 展開されず、そのまま出力⇒「こんにちは、$nameさん」
?>
さらに、PHPでは文字列自体がオブジェクトでなくても多彩な組み込み関数が用意されています。たとえば strlen()
、substr()
、str_replace()
などが代表例です。本記事を通して各関数の使いどころを押さえていきましょう。
PHPで文字列を扱う基本②:ヒアドキュメントとナウドキュメント
PHPでは複数行の文字列を扱いたい場面がよくあります。たとえば、HTMLテンプレートを出力したいときや、長文のメッセージを構築したいときです。そういったときに便利なのが ヒアドキュメント(Heredoc) と ナウドキュメント(Nowdoc) です。
どちらも複数行の文字列をすっきりと記述できる構文で、シンプルなクォーテーションで囲むよりも読みやすく、メンテナンスもしやすいのが特徴です。
ヒアドキュメント(Heredoc)
ヒアドキュメントは、<<<識別子
の形式で始まり、識別子と同じ名前を行頭に置くことで終了します。ダブルクォーテーションと同じように変数展開が可能です。
<?php
$name = "Taro";
$text = <<<EOD
こんにちは、{$name}さん。<br>
本日はご利用ありがとうございます。
またのご利用をお待ちしております。
EOD;
echo $text;
//【表示例】
//こんにちは、Taroさん。
//本日はご利用ありがとうございます。 またのご利用をお待ちしております。
?>
ヒアドキュメントはインデントができない点に注意が必要です。識別子 EOD
は行頭に記述し、スペースやタブを入れないようにしましょう。
ナウドキュメント(Nowdoc)
ナウドキュメントは、シングルクォーテーション付きの識別子(例:<<<'EOD'
)を使って記述します。変数展開は行われず、記述された文字列がそのまま出力されます。テンプレートを静的に扱いたいときに適しています。
<?php
$name = "Taro";
$text = <<<'EOD'
こんにちは、$nameさん。<br>
この文では変数は展開されません。
EOD;
echo $text;
//【表示例】
//こんにちは、$nameさん。<br>
//この文では変数は展開されません。
?>
ナウドキュメントは、HTMLコードやスクリプトなど変数の展開が不要な静的なコンテンツを埋め込む際に便利です。
ヒアドキュメントとナウドキュメントは、どちらもコードの可読性を高め、長い文字列を安全かつ簡潔に管理できる強力なツールです。特にテンプレート処理が多いPHP開発では、ぜひ覚えておきたい構文のひとつです。
ドット演算子( . )で文字列を連結する
PHPでは、文字列をつなげたい場合に「ドット演算子( .
)」を使用します。これは他の言語でよく使われる +
演算子とは異なる点に注意が必要です。
基本的な使い方
<?php
$firstName = "Taro";
$lastName = "Yamada";
$fullName = $firstName . "---" . $lastName;
echo $fullName;
// 出力: Taro---Yamada
?>
上記のように、複数の文字列や変数を .
でつなぐことで、一つの文字列として扱えます。
代入と連結を同時に行う
.=(ドットイコール)
を使うことで、文字列に追記することも可能です。
<?php
$message = "こんにちは";
$message .= "、Taroさん。";
$message .= " ご来店ありがとうございます。";
echo $message;
// 出力: こんにちは、Taroさん。 ご来店ありがとうございます。
?>
このように、複数の情報を順に加えていくときに便利です。
よくある注意点
.
を使ったあとは、必ずスペースを空けるのが推奨されます。空けないと可読性が下がるだけでなく、記述ミスの原因になることもあります。- 数値との連結時に意図しない挙動を防ぐため、必要であれば
strval()
やnumber_format()
などで明示的に文字列に変換することが望ましいです。
<?php
$price = 1500;
echo "価格は " . $price . " 円です。";
// 出力: 価格は 1500 円です。
?>
実務での応用例
HTMLタグを出力する場合にも、文字列連結は頻繁に使われます。
<?php
$title = "ようこそ";
$content = "<h1>" . $title . "</h1>";
echo $content;
?>
このように、テンプレート構築やメール本文の生成など、文字列の連結はPHP開発において基本中の基本とも言える操作です。
文字数を数える・切り出す:strlen
・substr
と mb_
系関数
PHPで文字列を扱う際、「文字数を数えたい」「一部分だけ取り出したい」といった操作は非常によく使われます。その際に注意が必要なのが、日本語のようなマルチバイト文字の扱いです。
strlen()
は「バイト数」を返す
<?php
$str = 'こんにちは';
echo strlen($str);
// 出力: 15
?>
この例のように、日本語は1文字あたり3バイト(UTF-8の場合)なので、strlen()
は5文字の「こんにちは」を15バイトとしてカウントします。これは英数字のような1バイト文字では問題になりませんが、マルチバイト文字では見た目の文字数とは一致しないため、表示やバリデーションなどで誤動作の原因になります。
正しく「文字数」を数えるには mb_strlen()
<?php
$str = 'こんにちは';
echo mb_strlen($str);
// 出力: 5
?>
mb_strlen()
を使えば、**正確に「見た目の文字数」**をカウントできます。UTF-8などのエンコーディングに対応しており、日本語でも安心して使用できます。
部分的に切り出すには mb_substr()
文字列の一部だけを取り出す場合も、同様に substr()
ではなく mb_substr()
を使うのが安全です。
<?php
$str = 'こんにちは';
echo mb_substr($str, 2, 2);
// 出力: にち
?>
このコードでは、3文字目から2文字分(「にち」)を切り出しています。mb_substr()
では開始位置も「バイト」ではなく「文字数」で指定できます。
mb_internal_encoding()
で毎回の設定を省略
mb_strlen()
や mb_substr()
には第3引数としてエンコーディングを指定できますが、毎回書くのは面倒です。そこで、事前に内部エンコーディングを設定しておくと便利です。
<?php
mb_internal_encoding('UTF-8');
$str = 'こんにちは';
echo mb_strlen($str);
// 出力: 5
?>
この設定により、mb_ 系関数はデフォルトで UTF-8 として動作し、コードの記述がシンプルになります。
補足:対応する mb_
関数一覧(一部)
通常関数 | マルチバイト対応版 | 用途 |
---|---|---|
strlen() | mb_strlen() | 文字数カウント |
substr() | mb_substr() | 文字列の一部を抽出 |
strtoupper() | mb_strtoupper() | 大文字変換(多言語対応) |
strpos() | mb_strpos() | 部分文字列の検索 |
まとめ
- マルチバイト文字(日本語など)では、
mb_
系関数を使うのが基本 strlen()
やsubstr()
は英数字向きで、日本語では誤動作の可能性あり- 内部エンコーディングを設定しておくと、より安全で簡潔なコードに
マルチバイト環境下での文字列操作は、Webアプリケーションの表示やバリデーションに直結する重要なテーマです。正しい関数選びを心がけましょう。
正規表現で高度なテキスト検索:preg_match と preg_replace
正規表現は複雑なパターンを検出・置換できる強力な仕組みです。PHPでは PCRE (Perl Compatible Regular Expressions) エンジンが採用され、preg_match()
や preg_replace()
を利用します。
例:メールアドレスの形式が正しいか検証する
<?php
// メールアドレスとして検証する対象の文字列
$email = 'user@example.com';
// 正規表現を使って、メールアドレスの形式が正しいかどうかを判定
// ^:文字列の先頭、$:文字列の末尾
// [\w\.-]+:英数字、アンダースコア、ドット、ハイフンのいずれか1文字以上
// @:@記号
// \.:ドット(ピリオド)、\w+:英数字1文字以上
if (preg_match('/^[\w\.-]+@[\w\.-]+\.\w+$/', $email)) {
echo '有効なメールアドレスです';
}
// 出力結果:有効なメールアドレスです
?>
例:日付の文字列をスラッシュからハイフンに変換
<?php
// 日付フォーマットの変換:スラッシュ区切りをハイフンに変更
$text = '2025/05/20';
// 正規表現で日付の「年/月/日」形式をキャプチャし、ハイフン区切りに変換
// (\d{4}):4桁の数字(年)
// (\d{2}):2桁の数字(月)
// (\d{2}):2桁の数字(日)
// $1, $2, $3 はそれぞれキャプチャした値に対応
$fixed = preg_replace('/(\d{4})\/(\d{2})\/(\d{2})/', '$1-$2-$3', $text);
echo $fixed;
// 出力:2025-05-20
?>
ユーザー入力の正規化:余計な空白や大小文字の統一で照合ミスを防ぐ
ユーザーが入力したデータは、見た目には正しくても、実際には余計な空白や大小文字の違いなどが原因で、想定通りに処理できないことがあります。たとえば、同じ「Hello」という文字でも "Hello"
と " hello "
では、プログラム上は一致しない別の文字列とみなされてしまいます。
こうした照合ミスを防ぐために重要なのが、**入力値の正規化(Normalization)**です。
空白の除去:trim()
関数
trim()
関数は、文字列の先頭と末尾の空白文字(スペース、タブ、改行など)を取り除くために使います。PHP 8.0以降では、全角スペース(U+3000)も除去対象に含まれており、マルチバイト文字を含む入力にも対応できます。
<?php
$raw = ' Hello World ';
$clean = trim($raw);
echo $clean;
// 出力:"Hello World"(先頭と末尾の空白が除去される)
?>
大小文字の統一:strtolower()
と strtoupper()
データの比較時に大小文字の差異を無視したい場合は、文字列をすべて小文字(または大文字)に統一するのが一般的です。
<?php
$clean = 'Hello World';
echo strtoupper($clean);
// 出力: HELLO WORLD(すべて大文字に変換)
echo strtolower($clean);
// 出力: hello world(すべて小文字に変換)
?>
たとえば、ログイン時のユーザーIDや、メールアドレス、カテゴリ名などを比較するときには、大文字と小文字を区別しないほうが自然なケースが多いため、正規化した上で比較することが推奨されます。
エンコーディングと文字化け対策:UTF-8 と mbstring の設定
文字化けはエンコーディングの不一致が主因です。Webアプリでは UTF-8 を統一 し、PHP 側では default_charset
、HTML では <meta charset="UTF-8">
を明示してください。
<?php
// PHP.ini での設定例
// default_charset = "UTF-8"
// スクリプト側で明示的に設定
ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');
?>
さらに、ファイルの保存形式や DB の照合順序 (collation) も UTF-8 系に揃えることで、環境差によるトラブルを大幅に減らせます。
実践例:フォーム入力を安全に処理するテキストサニタイズ
最後に、学んだ知識を活かしてフォーム入力を安全に処理する例を示します。trim()
で空白を削り、mb_substr()
で長さ制限、htmlspecialchars()
で XSS を防止します。
<?php
function sanitize_input(string $input, int $max = 255): string {
$input = trim($input); // 前後の空白を除去
$input = mb_substr($input, 0, $max); // 最大文字数を制限
return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}
$name = $_POST['name'] ?? '';
$safe_name = sanitize_input($name);
echo "こんにちは、{$safe_name}さん!";
?>
この手順を守ることで、余計な空白や過剰な文字数を排除しつつ、HTML タグの不正挿入による攻撃も防げます。実際の開発では CSRF トークンやサーバー側バリデーションも併用し、総合的なセキュリティを確保しましょう。
まとめ
本記事では、PHP の文字列操作に関する主要テクニックを一通り解説しました。基礎的な連結や分割から、マルチバイト対応、正規表現、エンコーディング、そして実践的なサニタイズまで押さえることで、実務で遭遇する多くの課題に対応できます。ぜひ本稿のサンプルコードをベースに、独自のユースケースに合わせた関数の組み合わせを試してみてください。