RitoLabo

PHPで文字列操作を行う関数まとめ

  • 公開:
  • 更新:
  • カテゴリ: PHP Basics
  • タグ: PHP,Basics,String

PHPで文字列操作を行う時とはどのような場面でしょうか。一部を取り出したり、置換したり、切り分けたり結合させたりと、様々なシーンがある中で、PHPにはそれを行う関数もたくさん用意されています。

今回は、PHPで文字列操作を行う際に使える関数を見ていきます。

アジェンダ
  1. 開発環境
  2. substr/mb_substr
  3. substr_count
  4. substr_replace
  5. strrev
  6. str_repeat
  7. str_pad
  8. explode
  9. implode
  10. strtok
  11. sscanf
  12. strpos/mb_strpos
  13. strrpos/mb_strrpos
  14. strstr/strchr/mb_strstr
  15. stristr/mb_stristr
  16. strrchr
  17. strspn
  18. 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の文字列操作関数は、その関数が返す結果そのものを求める場合もありますが、これらの結果を以てまた別の何らかの処理を行ったりと、応用を効かせた使い方もたくさんできるので、どう使うかは自身の腕次第でもあります。是非試してみてください。