- PHP
PHP文字列関数一覧|mb_substr・str_replaceなど文字列操作早見表
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>') |
<b> |
| 比較する | === / 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;
<a href="x">T&J's</a>
<script>alert('x')</script>
<b><br />
改行
| 文字 | 変換後 |
|---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
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期連続の黒字決算。