1. ホーム 
  2. 備忘録 
  3. PHP

文字列の操作

文字列操作の関数一覧

関数 用途
strlen/mb_srtlen 文字列の長さを得る
trim/ltrim/rtrim 文字列の先頭や末尾からホワイトスペースを取り除く
strpos 文字列内の部分文字列が最初に現れる位置を見つける
preg_match 正規表現によって文字列内に部分文字列が含まれているか確認する
str_replace/str_ireplace 文字列を置換する
preg_replace 正規表現によって文字列を置換する
str_repeat 文字列を反復する
substr/mb_substr 指定した文字列から任意の範囲を取り出す
substr_count 対象文字列から指定した文字列が何回登場するかを取得する
str_split 一定の長さで文字列を分割する
preg_split 正規表現で文字列を分割する
explode 文字列を文字列により分割する
implode 配列要素を文字列により連結する

文字列の長さを得る strlen/mb_strlen

strlen(string $string): int

与えられた $string の長さ(バイト数)を返す

なお日本語(マルチバイト文字)を操作する場合は mb_strlen() を使うこと


文字列の先頭や末尾からホワイトスペースを取り除く trim/ltrim/rtrim

trim(string $string, string $characters = " \n\r\t\v\x00"): string

与えられた $string の先頭や末尾から $characters で指定された空白文字を取り除いた文字列を返却する

l(eft)trim と r(ight)trim があり、それぞれ先頭から除外、末尾から除外の違いがある

$characters の指定がない場合はデフォルトで下記の文字を削除する

" " (ASCII 32 (0x20)), 通常の空白。
"\t" (ASCII 9 (0x09)), タブ。
"\n" (ASCII 10 (0x0A)), リターン。
"\r" (ASCII 13 (0x0D)), 改行。
"\0" (ASCII 0 (0x00)), NULバイト
"\v" (ASCII 11 (0x0B)), 垂直タブ

文字の検索 strpos

strpos(string $haystack, string $needle, int $offset = 0): int|false

$haystack の文字列から $needle が最初に現れる位置を見つける

PHP8.0.0より前のバージョンでは $needle が文字列でない場合、数値に変換され、文字の通常の値として扱われていた

この振る舞いは現在では推奨されていないため、明示的にキャストするなどで対応すること

$offset 指定すると検索開始位置が $offset の位置からになる

$offset が負の場合は文字列の終端から $offset 分戻った位置から検索開始となる

$text = 'abc';
$search = 'a';
$pos = strpos($text, $search);

// $pos は 0 もあり得るため、true/false判定を行う場合は必ず === で型まで確認すること
if( $pos === false ) {
  echo "文字列 '$search' は、文字列 '$text' の中で見つかりませんでした";
} else {
  echo "文字列 '$search' が文字列 '$text' の中で見つかりました";
  echo " 見つかった位置は $pos です";
}

正規表現でマッチングする preg_match

preg_match(
  string $pattern,
  string $subject,
  array &$matches = null,
  int $flags = 0,
  int $offset = 0
): int|false

$pattern で指定した正規表現により $subject を検索する

$matches を指定した場合は検索結果が代入される。 $matches[0] にはパターン全体にマッチしたテキストが代入され、 $matches[1] には 1 番目のキャプチャ用サブパターンにマッチした 文字列が代入され、といったように順に返却される。

$flags 返却の内容をフラグによって制御できる。詳細は公式ドキュメントを参照

$offset 開始位置のオフセット

単純な文字列の検索であれば strpos() を使用したほうが処理が速いので注意する


文字列を置換する str_replace/str_ireplace

str_replace(
    array|string $search,
    array|string $replace,
    string|array $subject,
    int &$count = null
): string|array

$search の文字列または配列を $subject 内から検索して $replace に置換する

$search が配列で $replace も配列の場合は順に置換される。$replace の要素数が足りない場合は空文字となる。

$search が配列で $replace が文字列の場合は全て $replace の文字列に置換される

$search が文字列で $replace が配列の場合は意味がない

$count この引数が指定されると置換回数が渡される

str_ireplace() の場合は大文字小文字が区別されない違いがある


正規表現で置換する preg_replace

preg_replace(
  string|array $pattern,
  string|array $replacement,
  string|array $subject,
  int $limit = -1,
  int &$count = null
): string|array|null

$pattern で指定した正規表現により $subject を検索して $replacement に置換する

$matches を指定した場合は検索結果が代入される。 $matches[0] にはパターン全体にマッチしたテキストが代入され、 $matches[1] には 1 番目のキャプチャ用サブパターンにマッチした 文字列が代入され、といったように順に返却される。

$limit 置換を行う最大回数

$count この引数が指定されると置換回数が渡される

単純な文字列の置換であれば str_replace() または str_ireplace() を使用したほうが処理が速いので注意する


文字列を反復する str_repeat

str_repeat(string $string, int $times): string

$string を $times 回繰り返した文字列を返す。

$times は0以上でなければいけない。0の場合は空文字列が返却される


文字の切り出し substr/mb_substr

substr(string $string, int $offset, ?int $length = null): string

$string の文字列から $offset の位置を基準に $length 分の文字を切り出す

$offset が負の場合は後ろから数えて $offset 番目から始まる文字列になる

$length を省略した場合は文字列の最後までになる

$length が負の場合は文字列の終端から $length 数分の文字が省略される

$res = substr("abcdef", 2);    // "cdef" を返す
$res = substr("abcdef", -1);    // "f" を返す
$res = substr("abcdef", -3, 1); // "d" を返す
$res = substr("abcdef", 0, -1);  // "abcde" を返す

なお日本語(マルチバイト文字)を操作する場合は mb_substr() を使うこと


文字の出現回数を返す substr_count

substr_count(
  string $haystack,
  string $needle,
  int $offset = 0,
  ?int $length = null
): int

文字列 &haystack の中での副文字列 &needle の出現回数を返す。大文字小文字は区別される。

$offset 開始位置のオフセット

$offset が負の場合は文字列の末尾から数える

$length 指定したオフセット以降に副文字列で検索する最大長

$length が負の場合は文字列の末尾から $length 数分の文字が省略される

$offset + $length が文字列の長さを超える場合は警告が発生する

$text = 'This is a test';
echo substr_count($text, 'is'); // 2

// テキストは 's is a test' になっているので, 1 が表示される
echo substr_count($text, 'is', 3);

// テキストは 's i' になっているので, 0 が表示される
echo substr_count($text, 'is', 3, 3);

// テキストは 'is is' になっているので, 2 が表示される
echo substr_count($text, 'is', 2, -7);

一定の長さで文字列を分割する str_split

str_split(string $string, int $length = 1): array

$length の長さで文字列 $string を分割します

平等に分割できない場合、 最後の要素だけはその長さより短くなります

$str = "Hello Friend";

// 1文字ずつ分割された配列になる[ 'H', 'e', 'l', 'l', 'o', ' ', 'F', 'r', 'i', 'e', 'n', 'd' ]
$arr1 = str_split($str);
// 5文字ずつ分割された配列になる[ 'Hello', ' Frie', 'nd' ]
$arr2 = str_split($str, 5);

正規表現で文字列を分割する preg_split

preg_split(
  string $pattern,
  string $subject,
  int $limit = -1,
  int $flags = 0
): array|false

正規表現 $pattern に従って $subject の文字列を分割する

$limit が正のとき $limit 個の部分文字列を配列として返す。残りの文字列は、最後の部分文字列に含めて返される

$limit が負または0のときは制限がないことを意味する

$flags 返却の内容をフラグによって制御できる。詳細は公式ドキュメントを参照


文字列を文字列で分割する explode

explode(string $separator, string $string, int $limit = PHP_INT_MAX): array

文字列 $string を分割文字列 $separator で分割して返す

$limit が正の場合、返却される配列は最大で $limit 個の要素が含まれる。最後の要素は $string の残り部分全てが含まれる

$limit が負の場合、最後から $limit 個の要素が除かれて返却される

$limit が 0 の場合は 1 を指定したものとみなされる


配列要素を文字列で連結する implode

implode(string $separator, array $array): string

配列 $array の要素を $separator で連結する


    参考文献

  1. 公式ドキュメント