PHPの文字列関数とは、strlen(長さ)、substr(切り出し)、str_replace(置換)、explode(分割)のように、文字列を調べたり加工したりするための組み込み関数です。日本語を扱うときは、文字単位で数える mb_strlen や mb_substr などの mb_ 版を使います。

この記事では、文字列関数を「やりたいこと」別の一覧表にまとめ、すべての関数に PHP 8.4.21 で実行した結果を付けました。あわせて、substr で日本語が文字化けする様子、strpos の 0 と false の見分け方、PHP 8.0〜8.4 で加わった str_contains・mb_str_pad・mb_trim などの新しい関数、全角半角を変換する mb_convert_kana のオプション一覧も紹介します。

PHP文字列関数の早見表

まず、目的ごとの代表的な関数です。「mb_版」の列に関数名があるものは、日本語を扱うときにそちらを使います。

やりたいこと 関数 mb_版 例 結果
長さを調べる strlen mb_strlen mb_strlen('こんにちは') 5
一部を切り出す substr mb_substr mb_substr('こんにちは', 0, 2) こん
位置を調べる strpos mb_strpos mb_strpos('日本語の文字列', '文字') 4
含むか調べる str_contains 不要 str_contains('PHP 8.4', '8.4') true
先頭・末尾を調べる str_starts_with / str_ends_with 不要 str_ends_with('index.php', '.php') true
置き換える str_replace 不要 str_replace('猫', '犬', '猫と猫') 犬と犬
分割する explode 不要 explode(',', 'a,b,c', 2) ["a","b,c"]
1文字ずつ分ける str_split mb_str_split mb_str_split('日本語') ["日","本","語"]
結合する implode 不要 implode('-', ['2026','10','02']) 2026-10-02
前後の空白を除く trim mb_trim(8.4) mb_trim(' 全角 ') 全角
桁をそろえる str_pad mb_str_pad(8.3) str_pad('7', 3, '0', STR_PAD_LEFT) 007
大文字にする strtoupper mb_strtoupper strtoupper('php') PHP
先頭を大文字にする ucfirst mb_ucfirst(8.4) ucfirst('hello world') Hello world
全角半角を変換する (なし) mb_convert_kana mb_convert_kana('ABC123', 'a') ABC123
書式を整える sprintf 不要 sprintf('%05d', 42) 00042
数値を3桁区切りにする number_format 不要 number_format(1234567) 1,234,567
HTML用にエスケープする htmlspecialchars 不要 htmlspecialchars('<b>') &lt;b&gt;
比較する === / strcmp 不要 strcasecmp('PHP', 'php') 0(等しい)

「mb_版が不要」と書いた関数は、UTF-8の日本語をそのまま渡しても正しく動きます(理由はあとの章で説明します)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「PHP文字列関数一覧|mb_substr・str_replaceなど文字列操作早見表」

動作確認した環境

項目 内容
PHP 8.4.21(CLI)
拡張モジュール mbstring、intl
文字コード ソースコードも内部エンコーディングも UTF-8(mb_internal_encoding() は UTF-8)

表の「結果」は、次の小さなコードで式と戻り値を並べて出力し、そのまま転記したものです。配列や真偽値は json_encode() の形(["a","b"]、true、false)で書いています。

<?php
function p(string $code): void
{
    $v = eval("return $code;");
    echo $code, ' => ', json_encode($v, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), PHP_EOL;
}
p("mb_substr('こんにちは', 0, 2)");
mb_substr('こんにちは', 0, 2) => "こん"

日本語はmb_関数を使う理由

mb_ が付かない関数は、文字列をバイト単位で扱います。UTF-8では日本語1文字が3バイトなので、長さや位置がずれます。

echo strlen('こんにちは'), ' ', mb_strlen('こんにちは'), PHP_EOL;

echo substr('こんにちは', 0, 6), PHP_EOL;       // 6バイト = 2文字
echo substr('こんにちは', 0, 4), '|', PHP_EOL;   // 4バイト = 1文字と1/3
echo bin2hex(substr('こんにちは', 0, 4)), PHP_EOL;
var_dump(mb_check_encoding(substr('こんにちは', 0, 4), 'UTF-8'));

echo mb_substr('こんにちは', 0, 2), PHP_EOL;
15 5
こん
こ�|
e38193e3
bool(false)
こん

strlen('こんにちは') は 5 ではなく 15(バイト数)を返しました。substr で4バイトを切り出すと、2文字目の先頭1バイト(e3)だけが残り、表示は文字化けし、UTF-8として正しくない文字列になります。この文字列をデータベースに保存したり json_encode() に渡したりするとエラーの原因になるので、日本語の切り出しは mb_substr を使います。

同じことがほかの関数でも起こります。

関数 日本語を渡した例 結果 mb_版での結果
strlen strlen('こんにちは') 15 mb_strlen → 5
substr substr('こんにちは', 0, 2) 文字化け(1文字に満たない) mb_substr → こん
strpos strpos('日本語の文字列', '文字') 12(バイト位置) mb_strpos → 4
str_split str_split('日本語') 9個のバイトに分かれる mb_str_split → ["日","本","語"]
strrev strrev('日本') 文字化け implode('', array_reverse(mb_str_split('日本語'))) → 語本日
str_pad str_pad('日本', 6, '*') 日本(すでに6バイトなので何も足されない) mb_str_pad → 日本****
strtoupper strtoupper('php àé') 変化なし mb_strtoupper → PHP ÀÉ
ucfirst ucfirst('élan') 変化なし mb_ucfirst → Élan
trim trim(' 全角 ') 全角スペースが残る mb_trim → 全角
sprintf の幅指定 sprintf('[%5s]', '日本') [日本](6バイトと数えられ、空白が入らない) mb_str_pad で幅をそろえる

mb_版がなくても日本語で使える関数

一方、str_replace、explode、implode、str_contains、str_starts_with、str_ends_with などは、バイト列として一致する部分を探すだけの関数です。UTF-8は「ある文字のバイト列が、別の文字の途中に現れない」作りになっているため、ソースもデータもUTF-8で統一されていれば、日本語をそのまま渡して正しく動きます。

判断基準 使う関数
「何文字目」「何文字ぶん」という数を扱う mb_ 版(mb_strlen、mb_substr、mb_strpos、mb_str_pad など)
文字の種類を変える(大文字小文字、全角半角) mb_ 版(mb_strtoupper、mb_convert_kana など)
同じ文字列を探す・置き換える・区切るだけ 通常の関数(str_replace、explode、str_contains など)

長さを調べる関数

関数 例 結果 説明
strlen strlen('abc') 3 バイト数
strlen strlen('こんにちは') 15 UTF-8の日本語は1文字3バイト
mb_strlen mb_strlen('こんにちは') 5 文字数
mb_strwidth mb_strwidth('PHP入門') 7 表示幅(半角=1、全角=2)
str_word_count str_word_count('Hello PHP world') 3 英単語の数
substr_count substr_count('banana', 'an') 2 部分文字列が現れる回数
mb_substr_count mb_substr_count('ももももすもも', 'もも') 3 回数(文字単位)

入力欄の「20文字以内」のような文字数チェックには mb_strlen を使います。 絵文字の 🍣 は strlen で 4、mb_strlen で 1 でした。

切り出す関数

関数 例 結果 説明
substr substr('abcdef', 1, 3) bcd 位置1から3バイト(位置は0始まり)
substr substr('abcdef', -2) ef 負の数は末尾から
substr substr('abc', 1, -1) b 長さに負の数を渡すと「末尾から何バイト手前まで」
substr substr('abc', 5) (空文字列) 範囲外は空文字列
mb_substr mb_substr('こんにちは', 0, 2) こん 位置0から2文字
mb_substr mb_substr('こんにちは', -2) ちは 末尾の2文字
mb_strimwidth mb_strimwidth('PHPの文字列関数を学ぶ', 0, 12, '…') PHPの文字列… 表示幅で切り、末尾に省略記号を付ける
mb_strimwidth mb_strimwidth('短い', 0, 12, '…') 短い 幅に収まるときはそのまま
mb_strcut mb_strcut('こんにちは', 0, 7) こん バイト数で切るが、文字の途中では切らない
strstr strstr('user@example.com', '@') @example.com 見つかった位置から後ろ
strstr strstr('user@example.com', '@', true) user 第3引数 true で手前
strrchr strrchr('a/b/c.txt', '/') /c.txt 最後に現れた位置から後ろ
添字 'abc'[0] / 'abc'[-1] a / c 1バイトだけ取り出す

一覧画面でタイトルを一定の幅に収めたいときは mb_strimwidth が便利です。 全角を2、半角を1として数えるので、見た目の幅がそろいます。

$title = 'PHPの文字列関数を学ぶ';
echo mb_strimwidth($title, 0, 12, '…'), PHP_EOL;
PHPの文字列…

検索する関数

関数 例 結果 説明
str_contains(8.0) str_contains('PHP 8.4', '8.4') true 含むか
str_contains str_contains('PHP', 'php') false 大文字小文字を区別する
str_contains str_contains('PHP', '') true 空文字列は常に true
str_starts_with(8.0) str_starts_with('index.php', 'index') true 先頭が一致するか
str_ends_with(8.0) str_ends_with('index.php', '.php') true 末尾が一致するか
strpos strpos('abcabc', 'b') 1 最初に現れる位置(0始まり)
strpos strpos('abcabc', 'a') 0 先頭で見つかると 0
strpos strpos('abcabc', 'x') false 見つからないと false
strrpos strrpos('abcabc', 'b') 4 最後に現れる位置
stripos stripos('ABCabc', 'c') 2 大文字小文字を区別しない
mb_strpos mb_strpos('日本語の文字列', '文字') 4 文字単位の位置
mb_strrpos mb_strrpos('ももすもも', 'も') 4 最後に現れる位置(文字単位)
strpbrk strpbrk('This is', 'st') s is いずれかの文字が最初に現れた位置から後ろ
strspn strspn('42abc', '0123456789') 2 指定した文字だけが続く長さ

strposの0とfalseの見分け方

strpos は、見つかった位置を整数で、見つからないときは false を返します。先頭で見つかったときの 0 は、if の条件では false と同じ扱いになるため、次のような結果になります。

$s = 'PHP入門';

// 直す前
if (strpos($s, 'PHP')) {
    echo 'A: 見つかった', PHP_EOL;
} else {
    echo 'A: 見つからない', PHP_EOL;
}

// 直した後(=== で false と比べる)
if (strpos($s, 'PHP') !== false) {
    echo 'B: 見つかった', PHP_EOL;
}

// PHP 8.0 以降は str_contains が使える
if (str_contains($s, 'PHP')) {
    echo 'C: 見つかった', PHP_EOL;
}

var_dump(strpos($s, 'PHP'), strpos($s, 'Java'), strpos($s, 'PHP') == false, strpos($s, 'PHP') === false);
A: 見つからない
B: 見つかった
C: 見つかった
int(0)
bool(false)
bool(true)
bool(false)

'PHP入門' は PHP で始まっているのに、Aでは「見つからない」と表示されました。0 == false は true ですが、0 === false は false です。

書き方 先頭で見つかった場合 おすすめ度
if (strpos($s, $x)) 見つからない扱いになる 位置 0 を取りこぼす
if (strpos($s, $x) !== false) 正しく判定できる PHP 7 でも動く
if (str_contains($s, $x)) 正しく判定できる PHP 8.0 以降ならこれが読みやすい

「含むかどうか」だけを知りたいときは str_contains、位置が必要なときだけ strpos と !== false、と使い分けましょう。

置換する関数

関数 例 結果 説明
str_replace str_replace('猫', '犬', '猫と猫') 犬と犬 すべて置き換える
str_replace str_replace(['a','b'], ['1','2'], 'aabbc') 1122c 配列で複数をまとめて置換
str_replace str_replace(['a','b'], '', 'aabbc') c 空文字列への置換=削除
str_ireplace str_ireplace('php', 'PHP', 'Php php') PHP PHP 大文字小文字を区別しない
substr_replace substr_replace('abcdef', '***', 1, 3) a***ef 位置と長さを指定して置換
substr_replace substr_replace('2026-10-02', '/', 4, 1) 2026/10-02 4バイト目の1文字を置換
strtr strtr('Hi all', ['Hi' => 'Hello', 'all' => 'world']) Hello world 対応表で一度に置換
strtr strtr('abc', 'ab', 'xy') xyc 1文字ずつ対応させて置換
preg_replace preg_replace('/\s+/', ' ', "a b \n c") a b c 正規表現で置換

引数の順番は str_replace(探す文字列, 置き換える文字列, 対象) です。対象が最後に来ます。

str_replaceとstrtrの違い

配列で複数の置換を指定したとき、str_replace は前から順番に置換を行います。そのため、1つ目の置換結果が2つ目の置換の対象になります。

echo str_replace(['a', 'b'], ['b', 'c'], 'ab'), PHP_EOL;
echo strtr('ab', ['a' => 'b', 'b' => 'c']), PHP_EOL;
cc
bc

str_replace では a → b に変わったあと、その b も c に変わって cc になりました。strtr は元の文字列を1回だけ走査するので、置換後の文字が再び置換されることはありません。 「AとBを入れ替える」ような置換では strtr が向いています。

分割・結合する関数

関数 例 結果 説明
explode explode(',', 'a,b,,c') ["a","b","","c"] 区切り文字で分割(空の要素も残る)
explode explode(',', 'a,b,c', 2) ["a","b,c"] 第3引数で最大の個数を指定
explode explode(',', '') [""] 空文字列は「空文字列1つ」の配列
implode implode('-', ['2026','10','02']) 2026-10-02 配列を結合
implode implode(',', [1, null, true, false]) 1,,1, null と false は空文字列、true は 1
str_split str_split('abcdef', 4) ["abcd","ef"] 指定バイト数ごとに分割
mb_str_split mb_str_split('日本語') ["日","本","語"] 1文字ずつ分割
mb_str_split mb_str_split('あいうえお', 2) ["あい","うえ","お"] 2文字ずつ分割
preg_split preg_split('/[\s,]+/', "a, b c,d") ["a","b","c","d"] 正規表現で分割
strtok strtok('a b c', ' ') a 区切り文字で最初の部分を取り出す
chunk_split chunk_split('abcdefgh', 4, '-') abcd-efgh- 一定の長さごとに区切りを入れる
wordwrap wordwrap('The quick brown fox', 10, "\n", true) The quick(改行)brown fox 指定幅で折り返す

explode(',', '') は空の配列ではなく [""](要素数1)を返します。 入力が空のときに要素数を0にしたい場合は、先に空文字列かどうかを確かめます。

$tags = $input === '' ? [] : explode(',', $input);

CSVの1行を分けたあと、各要素の前後の空白を除く定番の形です。

print_r(array_map('trim', explode(',', 'a , b ,c')));
Array
(
    [0] => a
    [1] => b
    [2] => c
)

整形する関数(trim・pad・repeat)

関数 例 結果 説明
trim trim(' abc ') abc 前後の空白・タブ・改行を除く
ltrim ltrim('007', '0') 7 左側から指定した文字を除く
rtrim rtrim('1.500', '0') 1.5 右側から指定した文字を除く
rtrim rtrim('path/', '/') path 末尾のスラッシュを除く
trim trim('[abc]', '[]') abc 第2引数は「除く文字の集まり」
trim trim(' 全角 ')  全角  全角スペースは除かれない
mb_trim(8.4) mb_trim(' 全角 ') 全角 全角スペースも除く
mb_ltrim(8.4) mb_ltrim(' 全角 ') 全角  左側だけ
mb_rtrim(8.4) mb_rtrim(' 全角 ')  全角 右側だけ
str_pad str_pad('7', 3, '0', STR_PAD_LEFT) 007 左を0で埋める
str_pad str_pad('abc', 6, '*') abc*** 右を埋める(既定)
str_pad str_pad('abc', 7, '-', STR_PAD_BOTH) --abc-- 両側を埋める
mb_str_pad(8.3) mb_str_pad('日本', 6, '*') 日本**** 文字数で数えて埋める
mb_str_pad mb_str_pad('日本', 6, '*', STR_PAD_LEFT) ****日本 全角文字でも埋められる
str_repeat str_repeat('=', 10) ========== 繰り返す
strrev strrev('abc') cba 逆順にする(バイト単位)
nl2br nl2br("a\nb") a<br />(改行)b 改行の前に <br /> を入れる

全角スペースを除く

フォームの入力では、前後に全角スペースが入ることがよくあります。PHP 8.4 では mb_trim で全角スペースもまとめて除けます。

var_dump(trim(' 全角 '));
var_dump(mb_trim(' 全角 '));
string(12) " 全角 "
string(6) "全角"

PHP 8.3 以前の環境では、正規表現で同じ結果が得られます(u はUTF-8として扱う指定です)。

var_dump(preg_replace('/\A[\s ]+|[\s ]+\z/u', '', " 全角 \n"));
string(6) "全角"

大文字・小文字を変える関数

関数 例 結果 説明
strtoupper strtoupper('php') PHP 大文字にする
strtolower strtolower('PHP') php 小文字にする
ucfirst ucfirst('hello world') Hello world 先頭だけ大文字
lcfirst lcfirst('Hello') hello 先頭だけ小文字
ucwords ucwords('hello php world') Hello Php World 各単語の先頭を大文字
ucwords ucwords('hello-php', '-') Hello-Php 区切り文字を指定
mb_strtoupper mb_strtoupper('php àé') PHP ÀÉ 全角英字やアクセントつき文字にも対応
mb_strtolower mb_strtolower('PHP') php 全角英字を小文字に
mb_convert_case mb_convert_case('hello world', MB_CASE_TITLE) Hello World 各単語の先頭を大文字
mb_ucfirst(8.4) mb_ucfirst('élan') Élan マルチバイト対応の ucfirst
mb_lcfirst(8.4) mb_lcfirst('Élan') élan マルチバイト対応の lcfirst

スネークケースとキャメルケースの変換は、これらを組み合わせて書けます。

echo lcfirst(str_replace('_', '', ucwords('user_name_id', '_'))), PHP_EOL;
echo strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', 'userNameId')), PHP_EOL;
userNameId
user_name_id

PHP 8.0〜8.4で加わった文字列関数

新しい版で加わった関数をまとめます。以前は数行で書いていた処理が、1つの関数で書けるようになっています。

版 関数 できること 以前の書き方
8.0 str_contains 含むか strpos($s, $x) !== false
8.0 str_starts_with 先頭が一致するか strncmp($s, $x, strlen($x)) === 0
8.0 str_ends_with 末尾が一致するか substr($s, -strlen($x)) === $x
8.3 mb_str_pad 文字数で数えて埋める str_pad と文字数の差を自分で計算
8.4 mb_trim / mb_ltrim / mb_rtrim 全角スペースも含めて前後を除く preg_replace で正規表現を書く
8.4 mb_ucfirst / mb_lcfirst マルチバイト対応で先頭の大文字小文字を変える mb_strtoupper(mb_substr($s, 0, 1)) . mb_substr($s, 1)

いずれも今回の PHP 8.4.21 で動作を確認しました(function_exists('mb_trim') と function_exists('mb_str_pad') はどちらも true)。運用中のPHPの版が分からないときは、php -v か echo PHP_VERSION; で確認してから使いましょう。

全角・半角を変換するmb_convert_kana

mb_convert_kana(文字列, オプション) は、全角と半角、ひらがなとカタカナを変換します。オプションの英字は小文字が「半角へ」、大文字が「全角へ」と覚えると整理しやすくなります。

オプション 変換 例 結果
a 全角英数字 → 半角 mb_convert_kana('ABC123', 'a') ABC123
A 半角英数字 → 全角 mb_convert_kana('ABC123', 'A') ABC123
n 全角数字 → 半角 mb_convert_kana('123', 'n') 123
s 全角スペース → 半角 mb_convert_kana('a b', 's') a b
S 半角スペース → 全角 mb_convert_kana('a b', 'S') a b
k 全角カタカナ → 半角カタカナ mb_convert_kana('カタカナ', 'k') カタカナ
K 半角カタカナ → 全角カタカナ mb_convert_kana('ガギグ', 'K') カ゛キ゛ク゛
KV 半角カタカナ → 全角(濁点を1文字にまとめる) mb_convert_kana('ガギグ', 'KV') ガギグ
HV 半角カタカナ → 全角ひらがな mb_convert_kana('アイウ', 'HV') あいう
C 全角ひらがな → 全角カタカナ mb_convert_kana('ひらがな', 'C') ヒラガナ
c 全角カタカナ → 全角ひらがな mb_convert_kana('カタカナ', 'c') かたかな

半角カタカナを全角にするときは、K だけでなく KV と書くのがポイントです。K だけだと「ガ」が「カ」と「゛」の2文字に分かれました。

フォームの入力をそろえるときによく使う組み合わせは asKV(英数字とスペースは半角へ、カタカナは全角へ)です。

echo mb_convert_kana('ABC 123 アイウ', 'asKV'), PHP_EOL;
ABC 123 アイウ
入力欄 おすすめのオプション 目的
郵便番号・電話番号 n または a 数字を半角にそろえる
メールアドレス a 英数字と記号を半角にそろえる
フリガナ KVC 半角カタカナとひらがなを全角カタカナにそろえる
検索キーワード asKV 表記のゆれを減らす

型や形式を変換する関数

関数 例 結果 説明
intval intval('42abc') 42 先頭の数値部分を整数にする
(int) (int)'12.9' 12 小数点以下は切り捨て
floatval floatval('1.5e3') 1500 浮動小数点数にする
strval strval(3.0) "3" 文字列にする
is_numeric is_numeric('1e5') true 数値として読めるか(指数表記も true)
is_numeric is_numeric('abc') false
ctype_digit ctype_digit('0123') true 数字だけで構成されているか
urlencode urlencode('a b&c=日本') a+b%26c%3D%E6%97%A5%E6%9C%AC URLのクエリ用(空白は +)
rawurlencode rawurlencode('a b') a%20b URLのパス用(空白は %20)
http_build_query http_build_query(['q' => '文字 列', 'p' => 2]) q=%E6%96%87%E5%AD%97+%E5%88%97&p=2 配列からクエリ文字列を作る
json_encode json_encode('日本語', JSON_UNESCAPED_UNICODE) "日本語" JSONにする(日本語をそのまま出す)
base64_encode base64_encode('PHP') UEhQ Base64にする
bin2hex bin2hex('AB') 4142 16進数の文字列にする
strip_tags strip_tags('<b>太字</b>です') 太字です HTMLタグを取り除く
mb_convert_encoding strlen(mb_convert_encoding('日本語', 'SJIS-win', 'UTF-8')) 6 文字コードを変換(Shift_JISでは1文字2バイト)
mb_detect_encoding mb_detect_encoding('日本語', ['ASCII','UTF-8','SJIS-win'], true) UTF-8 文字コードを推定する
mb_check_encoding mb_check_encoding("\xff", 'UTF-8') false 指定の文字コードとして正しいか

is_numeric は '1e5' や前後に空白のある '12 ' も true と判定しました。「数字だけ」を確かめたい入力(数量や郵便番号など)には ctype_digit や正規表現 /\A\d+\z/ が向いています。

htmlspecialcharsで画面に出す文字列をエスケープする

利用者が入力した文字列をHTMLに表示するときは、htmlspecialchars で特別な意味を持つ文字を置き換えます。

echo htmlspecialchars('<a href="x">T&J\'s</a>'), PHP_EOL;
echo htmlspecialchars("<script>alert('x')</script>"), PHP_EOL;
echo nl2br(htmlspecialchars("<b>\n改行")), PHP_EOL;
&lt;a href=&quot;x&quot;&gt;T&amp;J&#039;s&lt;/a&gt;
&lt;script&gt;alert(&#039;x&#039;)&lt;/script&gt;
&lt;b&gt;<br />
改行
文字 変換後
< &lt;
> &gt;
& &amp;
" &quot;
' &#039;

PHP 8.4 では、フラグを省略してもシングルクォートまで変換されました。改行を <br> にしたいときは、htmlspecialchars を先に、nl2br を後に適用します。順番を逆にすると <br /> までエスケープされて文字として表示されます。毎回書くのが長い場合は、短い関数にまとめておくと便利です。

function h(?string $s): string
{
    return htmlspecialchars($s ?? '', ENT_QUOTES, 'UTF-8');
}

比較する関数

書き方 例 結果 説明
=== '10' === '1e1' false 型も値も同じか。文字列の比較は基本これ
== '10' == '1e1' true 両方が数値として読めると数値で比較される
== 'abc' == 'ABC' false 大文字小文字は区別される
== 'abc' == 0 false PHP 8.0 以降の結果
== null == '' true 空文字列と null は等しい扱い
== '0' == false true '0' は偽として扱われる
strcmp strcmp('a', 'b') -1 小さい・等しい・大きいを -1・0・1 で返す
strcasecmp strcasecmp('PHP', 'php') 0 大文字小文字を区別せず比較
strncmp strncmp('abcd', 'abxx', 2) 0 先頭の2バイトだけ比較
strnatcmp strnatcmp('img12', 'img2') 1 数字を数値として比べる「自然順」
strcmp strcmp('img12', 'img2') -1 文字コード順では img12 が先
<=> 'abc' <=> 'abd' -1 宇宙船演算子。usort で使いやすい
similar_text similar_text('World', 'Word') 4 共通する文字数
levenshtein levenshtein('kitten', 'sitting') 3 編集距離(何文字の変更で一致するか)

文字列どうしの比較は === を使うと、'10' と '1e1' が等しいと判定されるような意図しない結果を避けられます。ファイル名の img2、img12 を人が見て自然な順に並べたいときは、strnatcmp や natsort() が使えます。

書式を整える関数(sprintf・number_format)

sprintfの書式一覧

sprintf(書式, 値...) は、% で始まる指定子の位置に値を埋め込んだ文字列を返します。画面に直接出すときは printf を使います。

書式 例 結果 説明
%s sprintf('%s様 %d点', '佐藤', 80) 佐藤様 80点 文字列
%d sprintf('%05d', 42) 00042 整数。05 は「5桁、0埋め」
%+d sprintf('%+d %+d', 5, -5) +5 -5 符号を必ず付ける
%.2f sprintf('%.2f', 3.14159) 3.14 小数点以下2桁
%05.1f sprintf('%05.1f', 3.14159) 003.1 全体5桁、小数1桁、0埋め
%5s / %-5s sprintf('[%5s][%-5s]', 'ab', 'ab') [ ab][ab ] 右寄せ/左寄せ
%'*8s sprintf('%\'*8s', 'abc') *****abc 埋める文字を指定
%x / %X sprintf('%x %X', 255, 255) ff FF 16進数
%b / %o sprintf('%b %o', 5, 8) 101 10 2進数/8進数
%e sprintf('%e', 12345.678) 1.234568e+4 指数表記
%% sprintf('%d%%', 50) 50% % そのもの
%1$s sprintf('%2$s %1$s', 'A', 'B') B A 引数の番号を指定
vsprintf vsprintf('%04d-%02d-%02d', [2026, 10, 2]) 2026-10-02 値を配列で渡す

%5s などの幅指定はバイト数で数えられるため、日本語では桁がそろいません(sprintf('[%5s]', '日本') は [日本])。日本語の桁ぞろえには mb_str_pad を使います。

number_formatで3桁区切りにする

例 結果 説明
number_format(1234567) 1,234,567 3桁ごとにカンマ
number_format(1234567.891, 2) 1,234,567.89 小数点以下2桁
number_format(1234.5) 1,235 小数を指定しないと四捨五入して整数に
number_format(0.5) / number_format(1.5) / number_format(2.5) 1 / 2 / 3 0.5 は切り上げ
number_format(1234.567, 1, '.', '') 1234.6 桁区切りなしで小数1桁
number_format(1234567.891, 2, ',', '.') 1.234.567,89 小数点と区切り文字を入れ替えた表記
number_format(-0.4) 0 結果が 0 のときは符号なし

number_format の戻り値は文字列です。カンマが入った文字列を計算に使うと数値として読めないため、計算は数値のまま行い、表示の直前に number_format を適用します。

変数を文字列に埋め込む

$name = 'PHP';
$v = 8.4;
echo "ver: {$name} {$v}\n";
echo 'ver: {$name}\n', "\n";
ver: PHP 8.4
ver: {$name}\n

ダブルクォートの中では変数と \n が展開され、シングルクォートの中ではそのままの文字として扱われます。

正規表現を使う関数(preg_)の概要

決まった文字列ではなく「数字が続く部分」「空白が1つ以上」のようなパターンで探すときは、preg_ で始まる関数を使います。ここでは代表的な使い方だけを紹介します。

関数 例 結果 説明
preg_match preg_match('/(\d{4})-(\d{2})/', '2026-10-02', $m) 1($m は ["2026-10","2026","10"]) 最初の一致を調べる
preg_match_all preg_match_all('/\d+/', 'a1b22c333') 3 すべての一致の数
preg_replace preg_replace('/(\d+)/', '[$1]', 'a1b22') a[1]b[22] パターンで置換
preg_replace_callback preg_replace_callback('/\d+/', fn($m) => $m[0] * 2, 'a5b10') a10b20 関数で置換内容を決める
preg_split preg_split('/[\s,]+/', "a, b c,d") ["a","b","c","d"] パターンで分割
preg_quote preg_quote('1+1=2?') 1\+1\=2\? 記号をエスケープする

日本語を含む文字列では、パターンの末尾に u を付けるとUTF-8の1文字を1文字として扱えます。

例 結果
preg_match('/^.{3}$/', '日本語') 0(9バイトと数えられ一致しない)
preg_match('/^.{3}$/u', '日本語') 1(3文字として一致)

固定の文字列を探す・置き換えるだけなら、str_contains や str_replace のほうが短く書けて読みやすくなります。

よくある質問

Q. substr と mb_substr はどう使い分けますか? A. 日本語など英数字以外を含む可能性がある文字列は mb_substr を使います。substr はバイト単位で切るため、UTF-8の日本語(1文字3バイト)を途中で切ると文字化けします。英数字だけと分かっている文字列(ID、日付の 2026-10-02 など)は substr で問題ありません。

Q. strpos で見つかっているのに if が偽になるのはなぜですか? A. 先頭(位置 0)で見つかっており、0 が偽として扱われているためです。strpos($s, $x) !== false と書くか、PHP 8.0 以降なら str_contains($s, $x) を使います。

Q. 文字列を連結するにはどう書きますか? A. .(ドット)でつなぎます。$a . $b で連結、$a .= $b で末尾に追加です。配列の要素をつなぐときは implode を使います。

Q. 文字数を数えるとき、絵文字はどうなりますか? A. mb_strlen('🍣') は 1 を返します。ただし、複数の絵文字を組み合わせた家族の絵文字(👨‍👩‍👧)は mb_strlen で 5、intl拡張の grapheme_strlen で 1 でした。見た目の1文字として数えたいときは grapheme_strlen を使います。

まとめ

  • 日本語の長さ・切り出し・位置は mb_strlen・mb_substr・mb_strpos を使う。strlen('こんにちは') は 15(バイト数)になる
  • 探す・置き換える・区切るだけの str_replace・explode・str_contains は、UTF-8ならそのまま日本語で使える
  • strpos は先頭で見つかると 0 を返す。判定は !== false か、PHP 8.0 以降の str_contains で書く
  • PHP 8.0 で str_contains・str_starts_with・str_ends_with、8.3 で mb_str_pad、8.4 で mb_trim・mb_ucfirst が加わった
  • 全角半角の変換は mb_convert_kana。半角カタカナを全角にするときは KV、入力の統一には asKV
  • 画面に出す文字列は htmlspecialchars、数値の表示は number_format、桁ぞろえは sprintf と mb_str_pad
  • 文字列の比較は ===。並べ替えには strcmp・strnatcmp・<=> を使う

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「PHP文字列関数一覧|mb_substr・str_replaceなど文字列操作早見表」

株式会社RJCでは、文字列操作のような基礎を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?