PHPで文字列操作を行う関数まとめ
- 公開日
- 更新日
- カテゴリ:Basics
- タグ:PHP,Basics,String

PHP で文字列操作を行う時とはどのような場面でしょうか。一部を取り出したり、置換したり、切り分けたり結合させたりと、様々なシーンがある中で、PHP にはそれを行う関数もたくさん用意されています。
今回は、PHP で文字列操作を行う際に使える関数を見ていきます。
Contents
- 開発環境
- substr/mb_substr
- substr_count
- substr_replace
- strrev
- str_repeat
- str_pad
- implode/join
- strtok
- sscanf
- strpos/mb_strpos
- strrpos/mb_strrpos
- strstr/strchr/mb_strstr
- stristr/mb_stristr
- strrchr
- strspn
- strcspn
開発環境
今回紹介する関数について、セクション毎に特に触れられていなければ PHP4 以降全てのバージョンで使えるものになります。
substr/mb_substr
substr関数は、指定した文字列から任意の範囲を取り出します。
substr ( string $string , int $start [, int $length ] )
substr ( 文字列, 開始, [字数] ) => return 文字列
第一引数に対象の文字列を、第二引数にはどこから切り出すかのインデックス(つまり、1 文字目は 0 から始まります)を渡します。また、マイナスを渡すと文字列の最後尾から遡ります。第三引数はオプションですが、開始のインデックスから何文字取り出すかを指定できます。第三引数を指定しない場合は、開始インデックスから最後までを取り出します。
$str = "abcdefg";
var_dump(substr($str, 2, 3)); // 2 番目から 3 文字
// => cde
var_dump(substr($str, 5)); // 5 番目から最後まで
// => fg
var_dump(substr($str, -3, 2)); // 後ろから3つ目から2文字
// => ef
var_dump(substr($str, -3)); // 後ろから3つ目からすべて
// => efg
substr関数はマルチバイト文字には対応していません。日本語に用いる場合には mb_substr関数を用います。
$str = "こんにちは";
var_dump(mb_substr($str, 2, 3));
// => にちは
substr_count
substr_count関数は、対象文字列から指定した文字列が何回登場するかを取得します。
int substr_count ( string $haystack , string $needle [, int $offset = 0 [, int $length ]] )
第一引数には対象文字列、第二引数には調べたい文字列を渡します。また、オプションとして第三引数にはどこから調べるか(開始インデックス)、第四引数には開始インデックスから何文字の範囲で調べるかを渡す事が出来ます。
$str = "This is a pen";
// $str の中に is は何回登場するか
var_dump(substr_count($str, 'is'));
// => 2
// $str の中に 1 は何回登場するか
$str = "0000 0001 0010 0011 0100 0101 0110 0111 1000 1001";
var_dump(substr_count($str, '1'));
// => 15
// $str の 36 字目から 4 文字中に 1 は何回登場するか
var_dump(substr_count($str, '1', 36, 4));
// => 3
// $str の 36 字目から最後までの中に 1 は何回登場するか
var_dump(substr_count($str, '1', 36));
// => 6
substr_replace
substr_replace関数は、対象文字列について、指定文字列で置換を行います。
mixed substr_replace ( mixed $string , mixed $replacement , mixed $start [, mixed $length ] )
第一引数に置換対象の文字列を、第二引数に置換文字列を、そして第三引数には置換対象文字列の何字目から置換を行うかの開始インデックスを指定します。また、オプションとして、第四引数には、開始インデックスから何文字を置換するかを指定できます。
$str = "This is a pen";
var_dump(substr_replace($str, "n apple", 9));
// => This is an apple
$str = "AAAA BB AAAA BB AAAA BB";
var_dump(substr_replace($str, "CC", 13, 2));
// => AAAA BB AAAA CC AAAA BB
strrev
strrev関数は、対象文字列の並びをさかさまにします。
string strrev ( string $string )
引数は1つだけ、対象の文字列を渡すだけです。
$str = "PHP is programming language";
var_dump(strrev($str));
// => egaugnal gnimmargorp si PHP
str_repeat
str_repeat関数は、文字列を指定回数分反復します。
string str_repeat ( string $input , int $multiplier )
第一引数に対象の文字列、第二引数に反復回数を渡します。
$str = "PHP/";
var_dump(str_repeat($str, 3));
// => PHP/PHP/PHP/
str_pad
str_pad関数は、対象となる文字列に対して、指定文字列の集合を用いて、指定バイト分に至るまで対象文字列を埋めます。
string str_pad ( string $input , int $pad_length [, string $pad_string = " " [, int $pad_type = STR_PAD_RIGHT ]] )
第一引数に対象文字列、第二引数に補完し作成するバイト長を渡します。オプションとして、第三引数に補完に使用する文字列の集合、第四引数に補完の方向を指定できます。オプションを指定しない場合は、バイト数分右側に空白を補完します。
$str = "PHP";
var_dump(str_pad($str, "10"));
// => 'PHP '
var_dump(str_pad($str, "10", "123456789"));
// => 'PHP1234567'
var_dump(str_pad($str, "10", "123456789", STR_PAD_LEFT));
// => '1234567PHP' (length=10)
var_dump(str_pad($str, "10", "123456789", STR_PAD_RIGHT));
// => 'PHP1234567'
var_dump(str_pad($str, "10", "123456789", STR_PAD_BOTH));
// => '123PHP1234'
第四引数には3つの定数を使用できます。
STR_PAD_LEFT 左側を補完します。 STR_PAD_RIGHT 右側を補完します。 STR_PAD_BOTH 左右を補完します。## explode
explode関数は、対象文字列を指定文字列により配列へ分割します。
array explode ( string $delimiter , string $string [, int $limit = PHP_INT_MAX ] )
第一引数にデミリタ(区切り文字)を指定し、第二引数に分割対象文字列を渡します。また、オプションとして第三引数に分割する上限数を指定できます。分割数が上限に達した場合は、配列の最終列へまとめて挿入されます。
$str = "PHP is programming language";
var_dump(explode(" ", $str));
// 0 => 'PHP'
// 1 => 'is'
// 2 => 'programming'
// 3 => 'language'
var_dump(explode(" ", $str, 3));
// 0 => 'PHP'
// 1 => 'is'
// 2 => 'programming language'
implode/join
implode関数は、配列を指定文字列にて結合し1つの文字列を作成します。
string implode ( string $glue , array $pieces )
string implode ( array $pieces )
第一引数に配列、第二引数に結合文字列を渡します。また、join() は implode() のエイリアスです。
$array = ['one', 'two', 'three', 'four'];
var_dump(implode($array, "-"));
// => 'one-two-three-four'
var_dump(join($array, "-"));
// => 'one-two-three-four'
strtok
strtok関数は、対象文字列をトークンに分割します。
string strtok ( string $str , string $token )
string strtok ( string $token )
第一引数に対象文字列を、第二引数に分割に用いる文字列を渡します。対象文字列を第一引数に取り分割を行うと、PHP 内部でそのチャンク情報を保持するので、二回目以降はトークンのみでコールする事がポイントです。二回目以降で対象文字列を渡すと、チャンクは先頭に戻ります。
$str = "PHP is programming language";
$chunk = strtok($str, ' ');
while($chunk !== false) {
var_dump($chunk);
$chunk = strtok(' ');
}
// 'PHP'
// 'is'
// 'programming'
// 'language'
sscanf
sscanf関数は、指定フォーマットに基づき、対象文字列を分割します。
mixed sscanf ( string $str , string $format [, mixed &$... ] )
第一引数に対象文字列を、第二引数にフォーマットを渡します。オプションとして、第三引数に受け取る変数を指定できます。また、第三引数を指定しない場合は、返り値として配列を返します。
$str = "2018/09/02";
$result = sscanf($str, "%d/%02s/%02s");
var_dump($result);
// 0 => int 2018
// 1 => string '09'
// 2 => string '02'
sscanf($str, "%d/%02d/%02d", $year, $month, $day);
var_dump($year);
// => 2018
var_dump($month);
// => 9
var_dump($day);
// => 2
strpos/mb_strpos
strpos関数は、対象文字列内に指定文字列が先頭から何番目(インデックス番号)に現れるかを取得できます。
int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
第一引数に対象文字列を、第二引数に検索を行う指定文字列を渡します。
$str = "ABCABCABC";
var_dump(strpos($str, 'C'));
// => 2
var_dump(strpos($str, 'ABC'));
// => 0
var_dump(strpos($str, '123'));
// => false
また、strpos関数はマルチバイト文字に対応していません。日本語などを扱う場合は、mb_strpos() を使います。
$str = "夏は7月上旬からだけど、夏休みは7月下旬からです。";
var_dump(mb_strpos($str, '夏'));
// => 0
var_dump(mb_strpos($str, '7月'));
// => 2
var_dump(mb_strpos($str, '8月'));
// => false
strrpos/mb_strrpos
strrpos関数は、対象文字列内に指定文字列が「最後」に現れるインデックス番号を取得できます。 strpos() の結果を最後インデックスにしたバージョンです。
int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )
第一引数に対象文字列を、第二引数に検索を行う指定文字列を渡します。
$str = "ABCABCABC";
var_dump(strrpos($str, 'C'));
// => 8
var_dump(strrpos($str, 'ABC'));
// => 6
また、こちらも同じく strrpos関数はマルチバイト文字に対応していません。日本語などを扱う場合は、mb_strrpos() を使います。
$str = "夏は7月上旬からだけど、夏休みは7月下旬からです。";
var_dump(mb_strrpos($str, '夏'));
// => 12
var_dump(mb_strrpos($str, '7月'));
// => 16
strstr/strchr/mb_strstr
strstr関数は、対象文字列に対して、指定文字列が最初に現れる位置を取得します。ただし、返り値としては、指定文字列が見つかった場所以降の文字列を全て返します。
string strstr ( string $haystack , mixed $needle [, bool $before_needle = FALSE ] )
第一引数に対象文字列を、第二引数に検索を行う指定文字列を渡します。尚、strchr() は strstr関数のエイリアスです。
$str = "PHP is Programming Language";
var_dump(strstr($str, 'Programming'));
// => 'Programming language'
var_dump(strstr($str, 'programming')); // 大文字と小文字を区別します
// => false
var_dump(strchr($str, 'Programming')); // strchr() は strstr() のエイリアスです
// => 'Programming language'
尚、strstr関数はマルチバイト文字に対応していません。日本語などを扱う場合は、mb_strstr() を使います。
$str = "夏は7月上旬からだけど、夏休みは7月下旬からです。";
var_dump(mb_strstr($str, '7月'));
// => '7月上旬からだけど、夏休みは7月下旬からです。'
stristr/mb_stristr
stristr関数は、strstr() と同じ処理を行いますが、こちらは大文字と小文字を区別しません。
$str = "PHP is Programming Language";
var_dump(stristr($str, 'Programming'));
// => 'Programming Language'
var_dump(stristr($str, 'programming'));
// => 'Programming Language'
また、マルチバイトの場合は mb_stristr() を使います。
$str = "PHP を操る人たちの事を PHPer(ペチパー)といいます。";
var_dump(mb_stristr($str, 'php'));
// => 'PHP を操る人たちの事を PHPer(ペチパー)といいます。'
strrchr
strrchr は、対象文字列中に、指定文字が最後に現れる場所を取得します。
string strrchr ( string $haystack , mixed $needle )
第一引数に検索対象文字列、第二引数に検索指定文字列を渡します。
$str = "Those who control PHP are called PHPer.";
var_dump(strrchr($str, "P"));
// => 'Per.'
strspn
strspn関数は、対象文字列に対して、指定文字列の集合(マスク)が使われている最初のセグメントの長さを取得します。
int strspn ( string $subject , string $mask [, int $start [, int $length ]] )
第一引数に対象文字列、第二引数にマスク(指定文字列の集合)を渡します。
$str = "AAA BBB CCC 111 222 333";
var_dump(strspn($str, "1234567890"));
// => 0
var_dump(strspn($str, "1234567890", 12));
// => 3
$str = "111 222 333 AAA BBB CCC";
var_dump(strspn($str, "1234567890"));
// => 3
当たり判定が少し特殊です。第三引数に開始インデックスを指定しない場合は、先頭から評価が始まるので、先頭の1文字目にマスク内の文字列が無ければ 0 が返ります。
strcspn
strcspn関数は、マスクにマッチしない最初のセグメントの長さを返します。 strspn() の逆説的な挙動をします。
$str = "AAA BBB CCC 111 222 333";
var_dump(strcspn($str, "1234567890"));
// => 12
$str = "AAA BBB CCC";
var_dump(strcspn($str, "1234567890"));
// => 11
前者は、12 番目でマッチする= 12 番目までマッチしないので 12 が返ります。
後者は、全てマッチしない= 11 番目までマッチしないので 11 が返っています。
まとめ
わりとベーシックなものが多かった中で、何のために使うのか若干イメージしずらい関数もあったと思います。
PHP の文字列操作関数は、その関数が返す結果そのものを求める場合もありますが、これらの結果を以てまた別の何らかの処理を行ったりと、応用を効かせた使い方もたくさんできるので、どう使うかは自身の腕次第でもあります。是非試してみてください。