PHP文字列操作 チートシート

cheatsheet

目的別のPHP文字列操作関数のまとめ

📌 文字列の長さ取得

文字列のバイト数または文字数を取得します。

関数 説明 注意点
strlen() 文字列のバイト数を返す。 マルチバイト文字(日本語など)は1文字が複数バイトとしてカウントされる。
mb_strlen() 文字列の文字数を返す。 マルチバイト文字を正しく1文字としてカウントする。文字エンコーディングの指定が必要な場合がある。

コード例:

<?php
$string_ascii = 'hello';
$string_jp = 'こんにちは';

// strlen: バイト数を返す
echo strlen($string_ascii); // 出力: 5
echo "\n";
echo strlen($string_jp);    // 出力: 15 (UTF-8の場合、1文字3バイト * 5文字)
echo "\n";

// mb_strlen: 文字数を返す
echo mb_strlen($string_ascii, 'UTF-8'); // 出力: 5
echo "\n";
echo mb_strlen($string_jp, 'UTF-8');    // 出力: 5
?>

🔍 文字列の検索

文字列内から特定の文字列やパターンを検索します。

特定の文字列の検索

関数 説明 特徴
strpos() 最初に現れる部分文字列のバイト位置を返す(大文字小文字を区別)。見つからない場合は false 高速だがマルチバイト非対応。0false の区別に注意 (=== を使用)。
stripos() 最初に現れる部分文字列のバイト位置を返す(大文字小文字を区別しない)。見つからない場合は false strpos の大文字小文字無視版。マルチバイト非対応。
strrpos() 最後に現れる部分文字列のバイト位置を返す(大文字小文字を区別)。見つからない場合は false 末尾から検索する場合に使用。マルチバイト非対応。
strripos() 最後に現れる部分文字列のバイト位置を返す(大文字小文字を区別しない)。見つからない場合は false strrpos の大文字小文字無視版。マルチバイト非対応。
strstr() / strchr() 最初に現れる部分文字列以降の部分を返す(大文字小文字を区別)。見つからない場合は false 第三引数で部分文字列より前の部分を返すことも可能。マルチバイト非対応。
stristr() 最初に現れる部分文字列以降の部分を返す(大文字小文字を区別しない)。見つからない場合は false strstr の大文字小文字無視版。マルチバイト非対応。
str_contains() (PHP 8+) 文字列に部分文字列が含まれるか (true/false) を返す(大文字小文字を区別)。 strpos !== false より直感的。マルチバイト非対応。
str_starts_with() (PHP 8+) 文字列が特定の部分文字列で始まるか (true/false) を返す(大文字小文字を区別)。 接頭辞のチェックに便利。マルチバイト非対応。
str_ends_with() (PHP 8+) 文字列が特定の部分文字列で終わるか (true/false) を返す(大文字小文字を区別)。 接尾辞のチェックに便利。マルチバイト非対応。
substr_count() 部分文字列が現れる回数を返す(大文字小文字を区別)。 重複しない出現回数をカウント。マルチバイト非対応。
mb_strpos() マルチバイト対応の strpos。文字位置を返す。 日本語などの検索に必須。エンコーディング指定が必要。
mb_stripos() マルチバイト対応の stripos。文字位置を返す。 大文字小文字を区別しないマルチバイト検索。
mb_strrpos() マルチバイト対応の strrpos。文字位置を返す。 末尾からのマルチバイト検索。
mb_strripos() マルチバイト対応の strripos。文字位置を返す。 末尾からの大文字小文字を区別しないマルチバイト検索。
mb_strstr() マルチバイト対応の strstr エンコーディング指定が必要。
mb_stristr() マルチバイト対応の stristr 大文字小文字を区別しないマルチバイト検索。
mb_substr_count() マルチバイト対応の substr_count マルチバイト文字の出現回数をカウント。

コード例 (strpos / mb_strpos):

<?php
$haystack = 'これはPHPのテストです。phpは良い言語です。';
$needle_jp = 'テスト';
$needle_en = 'php';

// strpos (バイト単位、大文字小文字区別) - マルチバイト文字には不向き
$pos1 = strpos($haystack, $needle_jp); // 正しく動作しない可能性がある
$pos2 = strpos($haystack, $needle_en);
if ($pos2 !== false) {
    echo "'php'が見つかったバイト位置: " . $pos2 . "\n"; // 出力例: 'php'が見つかったバイト位置: 33 (UTF-8の場合)
}

// mb_strpos (文字単位、大文字小文字区別)
$pos3 = mb_strpos($haystack, $needle_jp, 0, 'UTF-8');
if ($pos3 !== false) {
    echo "'テスト'が見つかった文字位置: " . $pos3 . "\n"; // 出力: 'テスト'が見つかった文字位置: 5
}

// mb_stripos (文字単位、大文字小文字無視)
$pos4 = mb_stripos($haystack, $needle_en, 0, 'UTF-8');
if ($pos4 !== false) {
    echo "'php'(大文字小文字無視)が最初に見つかった文字位置: " . $pos4 . "\n"; // 出力: 'php'(大文字小文字無視)が最初に見つかった文字位置: 3
}

// PHP 8+
if (function_exists('str_contains')) {
    echo "str_contains('テスト'): " . (str_contains($haystack, 'テスト') ? 'はい' : 'いいえ') . "\n"; // マルチバイト非対応のため注意
    echo "mb_strposを使用: " . (mb_strpos($haystack, 'テスト') !== false ? 'はい' : 'いいえ') . "\n"; // 推奨
    echo "str_starts_with('これ'): " . (str_starts_with($haystack, 'これ') ? 'はい' : 'いいえ') . "\n"; // マルチバイト非対応のため注意
    echo "mb_substrを使用: " . (mb_substr($haystack, 0, 2) === 'これ' ? 'はい' : 'いいえ') . "\n"; // 推奨
}
?>

正規表現による検索

関数 説明 特徴
preg_match() 正規表現にマッチするかどうかを調べる。最初に見つかった1件のみ。 マッチした場合は 1、しない場合は 0、エラー時は false を返す。第三引数にマッチした部分文字列が格納される。マルチバイト文字を扱う場合は u 修飾子が必要。
preg_match_all() 正規表現にマッチする全ての箇所を検索する。 マッチした回数を返す。第三引数に全てのマッチ結果が格納される。マルチバイト文字を扱う場合は u 修飾子が必要。

コード例 (preg_match / preg_match_all):

<?php
$text = '電話番号は 012-3456-7890 と 090-1111-2222 です。メールは test@example.com です。';
$pattern_tel = '/\d{2,4}-\d{4}-\d{4}/'; // 電話番号のパターン
$pattern_email = '/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/'; // Emailのパターン

// preg_match: 最初に見つかった電話番号
if (preg_match($pattern_tel, $text, $matches)) {
    echo "最初に見つかった電話番号: " . $matches[0] . "\n"; // 出力: 最初に見つかった電話番号: 012-3456-7890
}

// preg_match_all: 全ての電話番号
if (preg_match_all($pattern_tel, $text, $matches_all)) {
    echo "見つかった全ての電話番号: " . implode(', ', $matches_all[0]) . "\n"; // 出力: 見つかった全ての電話番号: 012-3456-7890, 090-1111-2222
}

// preg_match: Email
if (preg_match($pattern_email, $text, $email_match)) {
    echo "見つかったEmail: " . $email_match[0] . "\n"; // 出力: 見つかったEmail: test@example.com
}

// マルチバイト文字を含む検索 (u修飾子)
$text_jp = '今日は良い天気ですね。明日はどうかな?';
$pattern_jp = '/天気/u'; // 'u'修飾子でUTF-8として処理
if (preg_match($pattern_jp, $text_jp, $matches_jp)) {
    echo "'天気' が見つかりました。\n"; // 出力: '天気' が見つかりました。
}
?>

🔁 文字列の置換

文字列内の一部を別の文字列やパターンで置換します。

特定の文字列の置換

関数 説明 特徴
str_replace() 指定した部分文字列を全て置換する(大文字小文字を区別)。 検索文字列と置換文字列に配列を指定可能。マルチバイト非対応(バイト単位で処理されるため、文字化けの原因になりやすい)。
str_ireplace() 指定した部分文字列を全て置換する(大文字小文字を区別しない)。 str_replace の大文字小文字無視版。マルチバイト非対応。
substr_replace() 文字列の一部(開始位置と長さを指定)を置換する。 位置ベースの置換。マルチバイト非対応。

コード例 (str_replace):

<?php
$text = "I like apples. Apples are tasty.";
$search = "apples";
$replace = "oranges";

// 大文字小文字を区別して置換
$new_text1 = str_replace($search, $replace, $text);
echo $new_text1 . "\n"; // 出力: I like oranges. Apples are tasty. (最初の'apples'のみ置換)

// 大文字小文字を区別せずに置換
$new_text2 = str_ireplace($search, $replace, $text);
echo $new_text2 . "\n"; // 出力: I like oranges. oranges are tasty. ('apples'と'Apples'の両方が置換)

// 配列を使用した複数置換
$text_multi = "今日の天気は晴れ。気温は25度。";
$search_multi = ["晴れ", "25度"];
$replace_multi = ["曇り", "20度"];
$new_text_multi = str_replace($search_multi, $replace_multi, $text_multi);
echo $new_text_multi . "\n"; // 出力: 今日の天気は曇り。気温は20度。 (※マルチバイト文字の場合は注意)

// substr_replace: 位置指定での置換
$original = "abcdefgh";
$replacement = "XYZ";
$new_substr = substr_replace($original, $replacement, 3, 2); // 3バイト目から2バイト分を'XYZ'に置換
echo $new_substr . "\n"; // 出力: abcXYZfgh
?>

注意: str_replacestr_ireplace はマルチバイト文字(日本語など)を安全に処理できません。例えば “テスト” を “サンプル” に置換しようとすると、内部のバイト表現によっては意図しない結果や文字化けが発生する可能性があります。マルチバイト文字列の置換には preg_replace (u修飾子付き) や、必要に応じて mb_ereg_replace / mb_eregi_replace を使用してください。

正規表現による置換

関数 説明 特徴
preg_replace() 正規表現にマッチした部分を置換する。 強力なパターン置換が可能。検索パターン、置換文字列、対象文字列に配列を指定可能。後方参照($1, $2 など)が使える。マルチバイト文字を扱う場合は u 修飾子が必要。
preg_replace_callback() 正規表現にマッチした部分を、コールバック関数の戻り値で置換する。 マッチした内容に応じて動的な置換処理を行いたい場合に便利。マルチバイト文字を扱う場合は u 修飾子が必要。
mb_ereg_replace() マルチバイト対応の正規表現置換(大文字小文字を区別)。 ereg 系のマルチバイト版。POSIX拡張正規表現。preg_replace の方が推奨されることが多い。
mb_eregi_replace() マルチバイト対応の正規表現置換(大文字小文字を区別しない)。 mb_ereg_replace の大文字小文字無視版。

コード例 (preg_replace / preg_replace_callback):

<?php
$text = 'これは [商品A] です。価格は [PRICE] 円。';
$pattern = '/\[([A-Z]+)\]/'; // [大文字] のパターン

// preg_replace: パターンにマッチした部分を置換
$replacement = '***';
$new_text1 = preg_replace($pattern, $replacement, $text);
echo $new_text1 . "\n"; // 出力: これは *** です。価格は *** 円。

// preg_replace: 後方参照を使った置換
$replacement_ref = '($1)'; // $1には()でキャプチャした部分が入る
$new_text2 = preg_replace($pattern, $replacement_ref, $text);
echo $new_text2 . "\n"; // 出力: これは (商品A) です。価格は (PRICE) 円。

// preg_replace_callback: コールバック関数で置換内容を決定
$data = ['商品A' => 'すごい商品', 'PRICE' => 1000];
$new_text3 = preg_replace_callback(
    $pattern,
    function ($matches) use ($data) {
        $key = $matches[1]; // マッチした括弧の中身 (商品A, PRICE)
        return isset($data[$key]) ? $data[$key] : $matches[0]; // dataにあれば置換、なければ元のまま
    },
    $text
);
echo $new_text3 . "\n"; // 出力: これは すごい商品 です。価格は 1000 円。

// マルチバイト文字列の置換 (u修飾子)
$text_jp = '今日は【晴れ】です。明日は【曇り】の予報。';
$pattern_jp = '/【(.*?)】/u'; // 【】で囲まれた部分 (u修飾子必須)
$new_text_jp = preg_replace($pattern_jp, '「$1」', $text_jp);
echo $new_text_jp . "\n"; // 出力: 今日は「晴れ」です。明日は「曇り」の予報。
?>

✂️ 文字列の分割・結合

文字列を指定した区切り文字で配列に分割したり、配列要素を文字列に結合したりします。

関数 説明 特徴
explode() 文字列を区切り文字で分割し、配列にする。 区切り文字自身は結果に含まれない。第三引数で分割数の上限を指定可能。マルチバイト非対応。
implode() / join() 配列の要素を文字列で連結し、一つの文字列にする。 第一引数に連結文字、第二引数に配列を指定(逆も可)。
str_split() 文字列を指定したバイト数ごとに分割し、配列にする。 第二引数を省略すると1バイトずつ分割。マルチバイト非対応(文字化けの原因)。
preg_split() 正規表現パターンを区切り文字として文字列を分割する。 複雑な区切りパターンに対応可能。フラグ指定で区切り文字自体を含めたり、空要素を除去したりできる。マルチバイト文字を扱う場合は u 修飾子が必要。
mb_split() マルチバイト対応の正規表現で文字列を分割する。 preg_split の方が高機能で推奨されることが多い。POSIX拡張正規表現。
mb_str_split() (PHP 7.4+) 文字列を指定した文字数ごとに分割し、配列にする。 マルチバイト対応の str_split。第二引数を省略すると1文字ずつ分割。

コード例:

<?php
// explode / implode
$csv_string = "apple,banana,orange";
$fruits_array = explode(',', $csv_string);
print_r($fruits_array);
// 出力: Array ( [0] => apple [1] => banana [2] => orange )
echo "\n";

$joined_string = implode(' | ', $fruits_array);
echo $joined_string . "\n"; // 出力: apple | banana | orange

// str_split (マルチバイト非対応)
$text_ascii = "Hello";
$chars_ascii = str_split($text_ascii);
print_r($chars_ascii);
// 出力: Array ( [0] => H [1] => e [2] => l [3] => l [4] => o )
echo "\n";

$text_jp = "日本語"; // UTF-8: 9バイト
$chars_jp_broken = str_split($text_jp); // 1バイトずつ分割され文字化け
// print_r($chars_jp_broken); // 意図しない結果になる

// mb_str_split (PHP 7.4+) (マルチバイト対応)
if (function_exists('mb_str_split')) {
    $chars_jp_correct = mb_str_split($text_jp); // デフォルトは1文字ずつ
    print_r($chars_jp_correct);
    // 出力: Array ( [0] => 日 [1] => 本 [2] => 語 )
    echo "\n";
} else {
     // PHP 7.4未満の場合の代替 (preg_splitを使用)
     $chars_jp_correct_alt = preg_split('//u', $text_jp, -1, PREG_SPLIT_NO_EMPTY);
     print_r($chars_jp_correct_alt);
    // 出力: Array ( [0] => 日 [1] => 本 [2] => 語 )
     echo "\n";
}


// preg_split (正規表現で分割)
$text_complex = "item1, item2; item3 item4";
$items = preg_split('/[,;\s]+/', $text_complex); // カンマ、セミコロン、空白文字で分割
print_r($items);
// 出力: Array ( [0] => item1 [1] => item2 [2] => item3 [3] => item4 )
echo "\n";

// preg_split (マルチバイト対応)
$text_jp_split = "単語1、単語2 単語3"; // 全角カンマ、全角スペース
$words_jp = preg_split('/[、\s ]+/u', $text_jp_split); // u修飾子が必要
print_r($words_jp);
// 出力: Array ( [0] => 単語1 [1] => 単語2 [2] => 単語3 )

?>

⚖️ 文字列の比較

二つの文字列を比較します。

関数 説明 特徴
strcmp() 文字列をバイナリセーフで比較(大文字小文字を区別)。 str1 < str2 なら < 0str1 > str2 なら > 0str1 == str2 なら 0 を返す。マルチバイト非対応。
strncmp() 最初のNバイトについて文字列を比較(大文字小文字を区別)。 strcmp のバイト数指定版。マルチバイト非対応。
strcasecmp() 文字列をバイナリセーフで比較(大文字小文字を区別しない)。 strcmp の大文字小文字無視版。マルチバイト非対応。
strncasecmp() 最初のNバイトについて文字列を比較(大文字小文字を区別しない)。 strncmp の大文字小文字無視版。マルチバイト非対応。
substr_compare() 指定したオフセットから指定した長さの部分文字列を比較する。 大文字小文字の区別を指定可能。マルチバイト非対応。
strcoll() 現在のロケールに基づいて文字列を比較。 setlocale() で設定された照合順序に従う。例えば、ドイツ語の ‘ß’ と ‘ss’ を等価とみなす場合などに使う。
similar_text() 二つの文字列の類似性を計算し、マッチした文字数を返す。 第三引数で類似度をパーセンテージで取得可能。計算コストが高い場合がある。
levenshtein() 二つの文字列間のレーベンシュタイン距離(編集距離)を計算する。 一方の文字列をもう一方の文字列に変形させるのに必要な、文字の挿入・置換・削除の最小回数を返す。タイポの検出などに利用。

コード例:

<?php
$str1 = "apple";
$str2 = "Apple";
$str3 = "banana";

// strcmp (大文字小文字区別)
echo strcmp($str1, $str1); // 出力: 0 (等しい)
echo "\n";
echo strcmp($str1, $str2); // 出力: > 0 ('a' > 'A') - 環境依存の可能性あり、通常は正の値
echo "\n";
echo strcmp($str1, $str3); // 出力: < 0 ('a' < 'b') - 通常は負の値
echo "\n";

// strcasecmp (大文字小文字無視)
echo strcasecmp($str1, $str2); // 出力: 0 (等しい)
echo "\n";

// strncmp (最初の3バイトを比較)
echo strncmp("apple", "apply", 3); // 出力: 0 ("app" == "app")
echo "\n";
echo strncmp("apple", "apricot", 3); // 出力: < 0 ('p' < 'r') - 通常は負の値
echo "\n";

// similar_text
$similar_chars = similar_text("apple", "apply", $percent);
echo "類似文字数: " . $similar_chars; // 出力例: 類似文字数: 4
echo ", 類似度: " . round($percent, 2) . "%\n"; // 出力例: , 類似度: 80%

// levenshtein
echo levenshtein("apple", "apply"); // 出力: 1 (e -> y の置換1回)
echo "\n";
echo levenshtein("banana", "bandana"); // 出力: 1 (挿入/削除1回)
echo "\n";
echo levenshtein("kitten", "sitting"); // 出力: 3 (k->s, e->i, +g の3回)
echo "\n";

// Note: strcmp系の関数はマルチバイト非対応。日本語比較には通常 == や === を使うか、
// ロケール依存の比較が必要なら strcoll() を setlocale() と共に使う。
setlocale(LC_COLLATE, 'ja_JP.UTF-8'); // ロケール設定 (環境により設定値は異なる)
$jp1 = "あいう";
$jp2 = "アイウ";
echo strcmp($jp1, $jp2); // バイト比較なので 0 以外になる
echo "\n";
echo strcoll($jp1, $jp2); // ロケールによっては 0 になる場合も、ならない場合もある
echo "\n";

?>

🔪 文字列の一部取得・削除

文字列から一部分を抽出したり、先頭や末尾の不要な文字を削除したりします。

関数 説明 特徴
substr() 文字列の一部(開始バイト位置とバイト数を指定)を返す。 開始位置や長さに負の値を指定可能。マルチバイト非対応(文字化けの原因)。
mb_substr() マルチバイト対応の substr。文字単位で部分文字列を返す。 日本語などの部分文字列取得に必須。エンコーディング指定が必要。
trim() 文字列の先頭および末尾から空白文字(または指定した文字)を取り除く。 空白文字: 半角スペース, タブ, 改行, 復帰, NULバイト, 垂直タブ。第二引数で削除対象文字を指定可能。
ltrim() 文字列の先頭から空白文字(または指定した文字)を取り除く。 trim の左側(先頭)のみ版。
rtrim() / chop() 文字列の末尾から空白文字(または指定した文字)を取り除く。 trim の右側(末尾)のみ版。choprtrim のエイリアス。

コード例:

<?php
$text = "abcdefghij";
$text_jp = "あいうえおかきくけこ"; // UTF-8

// substr (バイト単位)
echo substr($text, 2, 5); // 2バイト目から5バイト分 -> cdefg
echo "\n";
echo substr($text, -3, 2); // 後ろから3バイト目から2バイト分 -> hi
echo "\n";
// echo substr($text_jp, 1, 3); // マルチバイト文字では文字化けする

// mb_substr (文字単位)
echo mb_substr($text_jp, 2, 5, 'UTF-8'); // 2文字目から5文字分 -> うえおかき
echo "\n";
echo mb_substr($text_jp, -3, 2, 'UTF-8'); // 後ろから3文字目から2文字分 -> くけ
echo "\n";

// trim, ltrim, rtrim
$padded_string = "  \t Hello World! \n\r ";
echo "Original: [" . $padded_string . "]\n";
echo "trim():   [" . trim($padded_string) . "]\n"; // 先頭末尾の空白除去 -> [Hello World!]
echo "ltrim():  [" . ltrim($padded_string) . "]\n"; // 先頭の空白除去 -> [Hello World! \n\r ]
echo "rtrim():  [" . rtrim($padded_string) . "]\n"; // 末尾の空白除去 -> [  \t Hello World!]

// 指定文字のトリム
$path = "/path/to/file/";
echo "rtrim('/'): [" . rtrim($path, '/') . "]\n"; // 末尾のスラッシュのみ除去 -> [/path/to/file]
$custom_chars = ".,;";
$text_chars = ",.Hello;.";
echo "trim(',.;'): [" . trim($text_chars, $custom_chars) . "]\n"; // 先頭末尾の指定文字除去 -> [Hello]

// マルチバイト空白のトリム (通常の trim は全角スペースに対応しない)
$jp_space = " 全角スペース "; // 全角スペース
echo "trim(): [" . trim($jp_space) . "]\n"; // 全角スペースは除去されない
// 全角スペースも除去する例 (preg_replace を使用)
$trimmed_jp_space = preg_replace('/^[\\s ]+|[\\s ]+$/u', '', $jp_space);
echo "preg_replace: [" . $trimmed_jp_space . "]\n"; // -> [全角スペース]

?>

🔄 大文字・小文字変換

文字列のアルファベットの大文字・小文字を変換します。

関数 説明 特徴
strtolower() 文字列全体を小文字に変換する。 マルチバイト非対応。
strtoupper() 文字列全体を大文字に変換する。 マルチバイト非対応。
ucfirst() 文字列の先頭の文字のみを大文字に変換する。 マルチバイト非対応。
lcfirst() 文字列の先頭の文字のみを小文字に変換する。 マルチバイト非対応。
ucwords() 文字列中の各単語の先頭文字を大文字に変換する。 単語の区切りはスペース、タブ、改行など。第二引数で区切り文字を指定可能。マルチバイト非対応。
mb_strtolower() マルチバイト対応の strtolower 全角アルファベットなども小文字に変換可能。エンコーディング指定が必要。
mb_strtoupper() マルチバイト対応の strtoupper 全角アルファベットなども大文字に変換可能。エンコーディング指定が必要。
mb_convert_case() マルチバイト文字列のケース(大文字・小文字・タイトルケースなど)を変換する。 MB_CASE_UPPER, MB_CASE_LOWER, MB_CASE_TITLE などのモードを指定。全角/半角変換なども可能 (MB_CASE_FOLD など別のモード)。

コード例:

<?php
$text = "hELLo wORLd!";
$text_jp = "ABC xyz"; // 全角アルファベット

// 基本的なケース変換
echo strtolower($text) . "\n"; // 出力: hello world!
echo strtoupper($text) . "\n"; // 出力: HELLO WORLD!
echo ucfirst("hello") . "\n"; // 出力: Hello
echo lcfirst("HELLO") . "\n"; // 出力: hELLO
echo ucwords("hello world again") . "\n"; // 出力: Hello World Again

// マルチバイト対応のケース変換
echo mb_strtolower($text_jp, 'UTF-8') . "\n"; // 出力: abc xyz
echo mb_strtoupper($text_jp, 'UTF-8') . "\n"; // 出力: ABC XYZ

// mb_convert_case
echo mb_convert_case($text, MB_CASE_UPPER, "UTF-8") . "\n"; // 出力: HELLO WORLD!
echo mb_convert_case($text, MB_CASE_LOWER, "UTF-8") . "\n"; // 出力: hello world!
echo mb_convert_case("hello world", MB_CASE_TITLE, "UTF-8") . "\n"; // 出力: Hello World
echo mb_convert_case($text_jp, MB_CASE_LOWER, "UTF-8") . "\n"; // 出力: abc xyz

// mb_convert_case で全角/半角変換 (参考)
$text_zen = "ABC123";
$text_han = "abc456";
echo mb_convert_kana($text_zen, "a", "UTF-8") . "\n"; // 全角英数を半角に -> ABC123
echo mb_convert_kana($text_han, "A", "UTF-8") . "\n"; // 半角英数を全角に -> abc456

?>

📝 文字列のフォーマット

数値をフォーマットしたり、文字列を指定した形式に整形したりします。

関数 説明 特徴
sprintf() フォーマット文字列に従って引数を処理し、整形された文字列を返す。 %s (文字列), %d (整数), %f (浮動小数点数), %04d (ゼロ埋め整数) など多彩な指定子がある。
printf() フォーマット文字列に従って引数を処理し、結果を直接出力する。 sprintf と似ているが、戻り値は出力したバイト数(またはエラー時 false)。
vsprintf() sprintf と同様だが、引数を配列で受け取る。 可変長引数を扱う関数内で便利。
vprintf() printf と同様だが、引数を配列で受け取る。 vsprintf の直接出力版。
number_format() 数字を桁区切り(例: 3桁ごとカンマ)でフォーマットする。 小数点以下の桁数、小数点、桁区切り文字を指定可能。
nl2br() 文字列中の改行文字(\n, \r\n など)の前に HTML の <br /> タグを挿入する。 テキストエリアの内容などをHTML表示する際に便利。XHTML互換モードも指定可能。
wordwrap() 指定した文字数で文字列を折り返す。 長い行を指定幅で分割する際に使用。区切り文字や強制分割モードを指定可能。マルチバイト非対応。
chunk_split() 文字列を指定した長さごとに分割し、区切り文字を挿入する。 BASE64エンコードされた文字列の整形などに使われる。マルチバイト非対応。

コード例:

<?php
// sprintf / printf
$name = "Alice";
$age = 30;
$price = 19.99;
$formatted_string = sprintf("名前: %s, 年齢: %d歳, 価格: %.2fドル", $name, $age, $price);
echo $formatted_string . "\n"; // 出力: 名前: Alice, 年齢: 30歳, 価格: 19.99ドル

printf("商品コード: %06d\n", 123); // 出力: 商品コード: 000123

// vsprintf (配列で引数を渡す)
$args = ["Bob", 25, 9.50];
$formatted_vsprintf = vsprintf("名前: %s, 年齢: %d歳, 価格: %.2fドル", $args);
echo $formatted_vsprintf . "\n"; // 出力: 名前: Bob, 年齢: 25歳, 価格: 9.50ドル

// number_format
$number = 1234567.8912;
echo number_format($number) . "\n"; // 出力: 1,234,568 (デフォルト: 整数、カンマ区切り)
echo number_format($number, 2) . "\n"; // 出力: 1,234,567.89 (小数点以下2桁)
echo number_format($number, 2, ',', '.') . "\n"; // 出力: 1.234.567,89 (小数点',' 桁区切り'.')

// nl2br
$text_with_newlines = "一行目。\n二行目。\r\n三行目。";
echo nl2br($text_with_newlines) . "\n";
/* 出力:
一行目。
二行目。
三行目。 */ // wordwrap (マルチバイト非対応) $long_text = "This is a very long string that needs to be wrapped to fit within a certain width."; echo wordwrap($long_text, 20, "<br />\n") . "\n"; /* 出力例: This is a very long
string that needs to
be wrapped to fit
within a certain
width. */ // chunk_split (マルチバイト非対応) $data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; echo chunk_split($data, 5, '-') . "\n"; // 出力: ABCDE-FGHIJ-KLMNO-PQRST-UVWXY-Z- ?>

注意: wordwrapchunk_split はバイト単位で動作するため、マルチバイト文字(日本語など)を含む文字列に使用すると文字化けや意図しない分割が発生します。マルチバイト対応が必要な場合は、mb_str_split や正規表現などを組み合わせて自作する必要があります。

🛡️ HTMLエンティティ処理

HTMLとして特別な意味を持つ文字を安全な形式(HTMLエンティティ)に変換したり、元に戻したりします。また、HTMLタグを除去します。

関数 説明 特徴
htmlspecialchars() 特定のHTML特殊文字 (&, ", ', <, >) をHTMLエンティティに変換する。 XSS対策の基本。ENT_QUOTES フラグでシングル/ダブルクォートの変換を制御。文字エンコーディング指定が重要。
htmlentities() 適用可能な全ての文字をHTMLエンティティに変換する。 htmlspecialchars より広範囲の文字を変換。特定の文字エンコーディングで表示できない文字をエンティティ化したい場合などに使用。
htmlspecialchars_decode() htmlspecialchars() で変換されたエンティティを元の文字に戻す。 ENT_QUOTES フラグに対応。
html_entity_decode() 全てのHTMLエンティティを元の文字に戻す。 htmlentities() の逆操作。文字エンコーディング指定が重要。
strip_tags() 文字列からHTMLおよびPHPタグを取り除く。 第二引数で許可するタグを指定可能。単純な除去であり、不完全なHTMLや悪意のあるコードに対しては脆弱な場合がある。サニタイズ目的での利用は注意が必要。

コード例:

<?php
$html_input = '<script>alert("XSS"); 

Hello & World

'; $text_input = "C'est l'été. Ça coûte cher."; // フランス語など // htmlspecialchars (XSS対策の基本) $escaped_html = htmlspecialchars($html_input, ENT_QUOTES, 'UTF-8'); echo "htmlspecialchars(): " . $escaped_html . "\n"; // 出力例: htmlspecialchars(): <script>alert("XSS");</script> <p style="color:red;">Hello & World</p> // htmlentities (より多くの文字を変換) $escaped_entities = htmlentities($text_input, ENT_QUOTES | ENT_HTML5, 'UTF-8'); echo "htmlentities(): " . $escaped_entities . "\n"; // 出力例: htmlentities(): C'est l'été. Ça coûte cher. // デコード $decoded_special = htmlspecialchars_decode($escaped_html, ENT_QUOTES); echo "htmlspecialchars_decode(): " . $decoded_special . "\n"; // 出力例: htmlspecialchars_decode(): <script>alert("XSS");

Hello & World

$decoded_entities = html_entity_decode($escaped_entities, ENT_QUOTES | ENT_HTML5, 'UTF-8'); echo "html_entity_decode(): " . $decoded_entities . "\n"; // 出力例: html_entity_decode(): C'est l'été. Ça coûte cher. // strip_tags (タグ除去) $stripped_text = strip_tags($html_input); echo "strip_tags(): " . $stripped_text . "\n"; // 出力例: strip_tags(): alert("XSS"); Hello & World // strip_tags (特定のタグを許可) $stripped_allow_p = strip_tags($html_input, '

'); echo "strip_tags('

'): " . $stripped_allow_p . "\n"; // 出力例: strip_tags('

'): alert("XSS");

Hello & World

?>

重要: ユーザー入力をHTMLとして表示する際は、必ず htmlspecialchars() などでエスケープ処理を行ってください。これを怠るとクロスサイトスクリプティング(XSS)脆弱性の原因となります。strip_tags() はサニタイズ用途には不十分な場合があります。

🌐 マルチバイト文字列設定・その他

マルチバイト文字列(日本語など)を扱う上で重要な設定関数や、その他の関連関数です。

関数 説明 特徴
mb_internal_encoding() 内部文字エンコーディングを設定または取得する。 多くの mb_* 関数はこの設定をデフォルトとして利用する。スクリプトの最初の方で設定推奨 (例: mb_internal_encoding('UTF-8');)。
mb_language() 現在の言語を設定または取得する。 主に mb_send_mail でのエンコーディングに使われる (例: mb_language('Japanese');)。
mb_convert_encoding() 文字列の文字エンコーディングを変換する。 異なるエンコーディング間の変換(例: Shift_JIS から UTF-8)に必須。変換元と変換先のエンコーディングを指定。
mb_detect_encoding() 文字列の文字エンコーディングを検出する。 エンコーディングが不明な場合に試みる。検出精度は100%ではない。検出候補のリストを指定可能。
mb_check_encoding() 文字列が指定したエンコーディングとして有効かチェックする。 データの妥当性確認に使用。
mb_convert_kana() 全角・半角カタカナ、ひらがな、英数字などを相互に変換する。 オプションが豊富 (例: 'K' 全角カナ→半角カナ, 'a' 全角英数→半角英数, 'H' 半角カナ→全角カナ)。エンコーディング指定が必要。
mb_http_input() HTTP入力文字エンコーディングを設定または取得する。 GET/POST などで受け取るデータのエンコーディング解釈に関連。通常は php.ini で設定。
mb_http_output() HTTP出力文字エンコーディングを設定または取得する。 スクリプトが出力する際のデフォルトエンコーディング。header('Content-Type: ...') で上書き可能。
mb_regex_encoding() マルチバイト正規表現関数 (mb_ereg_*) で使用されるエンコーディングを設定または取得する。 mb_ereg_replace などを使う場合に設定が必要。

コード例:

<?php
// 基本設定 (スクリプトの先頭で行うのが一般的)
mb_internal_encoding('UTF-8');
mb_language('Japanese');
// mb_http_output('UTF-8'); // php.iniでの設定が推奨されることが多い

// エンコーディング変換
$sjis_string = mb_convert_encoding("これはShift_JISの文字列です。", "SJIS-win", "UTF-8");
// echo $sjis_string; // このままUTF-8環境で出力すると文字化けする

$utf8_string = mb_convert_encoding($sjis_string, "UTF-8", "SJIS-win");
echo "変換後 (UTF-8): " . $utf8_string . "\n"; // 出力: 変換後 (UTF-8): これはShift_JISの文字列です。

// エンコーディング検出 (精度に注意)
$detected_encoding = mb_detect_encoding($utf8_string, "UTF-8, SJIS-win, EUC-JP", true); // 厳密モード
echo "検出されたエンコーディング: " . $detected_encoding . "\n"; // 出力: 検出されたエンコーディング: UTF-8

// エンコーディングチェック
if (mb_check_encoding($utf8_string, "UTF-8")) {
    echo "文字列は有効なUTF-8です。\n";
} else {
    echo "文字列は有効なUTF-8ではありません。\n";
}

// 全角/半角 カナ/英数 変換
$text = "テスト test 123"; // 半角カナ、半角英数、全角数字
// 半角カナ -> 全角カナ ('K'), 全角数字 -> 半角数字 ('n')
$converted_kana = mb_convert_kana($text, "Kn", "UTF-8");
echo "mb_convert_kana('Kn'): " . $converted_kana . "\n"; // 出力: mb_convert_kana('Kn'): テスト test 123

// 全角英数 -> 半角英数 ('a'), 半角スペース -> 全角スペース ('S')
$text2 = "ABC DEF";
$converted_alpha_space = mb_convert_kana($text2, "aS", "UTF-8");
echo "mb_convert_kana('aS'): " . $converted_alpha_space . "\n"; // 出力: mb_convert_kana('aS'): ABC DEF (スペースは全角のまま)
// 全角英数 -> 半角英数 ('a'), 全角スペース -> 半角スペース ('s')
$converted_alpha_space2 = mb_convert_kana($text2, "as", "UTF-8");
echo "mb_convert_kana('as'): " . $converted_alpha_space2 . "\n"; // 出力: mb_convert_kana('as'): ABC DEF (スペースも半角に)

?>

コメント

タイトルとURLをコピーしました