PHP

【PHP】文字列が含まれているか検索をする

こんにちは、らいか(@hideiwa1)です。

今回は、変数に特定の文字列が含まれているか、部分一致で検索する方法について解説します。

文字列から検索する

まずは、文字列に検索する文字列が含まれているかを検索する方法を紹介します。

strpos()

1つ目は、strpos()です。
文字列の中を検索し、最初に現れる位置を返します。

strpos(‘検索対象の文字列’、’検索したい文字列’)

返り値は、検索した文字が最初に現れる位置(数字)
見つからない場合は false を返します


  $haystack = 'abcdefgh';  //検索対象
  $needle = 'abc';  //検索したい文字列

  $result = strpos($haystack, $needle);  // 0

  $needle-2 = 'cd';  //検索したい文字列

  $result-2 = strpos($haystack, $needle-2);  // 2

  $needle-3 = 'xw';  //検索したい文字列

  $result-3 = strpos($haystack, $needle-3);  // false

注意点としては、先頭で見つかった場合、返り値は 0 となる点です。
if文で判定する場合、0 は false と判定されるため、‘===’で型まで判定する必要があります。


  $haystack = 'abcdefgh';  //検索対象
  $needle = 'abc';  //検索したい文字列

  $result = strpos($haystack, $needle);  // 0

  if($result)
  {
      echo '見つかりました。';  // こちらは表示されない
  }

  if($result !== false)
  {
      echo '見つかりました。';  // こちらは表示される
  }

str_contains()

2つ目は、str_contains()を使う方法です。
文字列が含まれるかを true / false で返します。

str_contains(‘検索対象の文字列’、’検索したい文字列’)

返り値は、見つかった場合は true 、見つからない場合は false を返します


  $haystack = 'abcdefgh';  //検索対象
  $needle = 'abc';  //検索したい文字列

  $result = str_contains($haystack, $needle);  // true

  $needle-2 = 'xw';  //検索したい文字列

  $result-2 = strpos($haystack, $needle-2);  // false

前述の strpos() に比べて、型の判定を行わなくて良いのがメリットです。

注意点として、対応はPHP8以降となります。

preg_match()

3つ目は preg_match() です。
こちらは正規表現を使って検索することが出来ます。

preg_match(‘検索したい文字列’、’検索対象の文字列’)

返り値は、見つかった場合は 1 、見つからない場合は 0 を返します。
失敗した場合は false を返します。


  $subject = "abcdef";
  $pattern = '/def/';
  
  preg_match($pattern, $subject)  // 1

  $pattern-2 = 'def';
  
  preg_match("/$pattern-2/", $subject)  // 1

注意点として、検索する文字にはデリミタ(区切り文字、一般的には’/’)を含む必要があります。
もし変数内の文字を使用したい場合、$pattern-2 のように “/変数名/” とする必要があります。

preg_match() は多少速度が遅くなるため、正規表現を使わない場合はstrpos() や str_contains() を使用しましょう。

配列から検索する

次は、配列の中に検索する文字列が含まれているかを検索する方法を紹介します。

preg_grep()

配列から部分一致で検索するには、preg_grep() を使用します。
正規表現を使用して検索し、一致するカラムを返します。

preg_grep(‘検索したい文字列’、’検索対象の文字列’)

返り値は、見つかった場合はカラムを返します。
失敗した場合は false を返します。


  $array = ['abcde', 'fghi', 'jklmn'];  //検索対象
  $patten = 'bc';  //検索したい文字列

  preg_grep("/$pattern/", $array);  // ['abcde']

注意点として、preg_match() と同様に、検索する文字にはデリミタ(区切り文字、一般的には’/’)を含む必要があります。

まとめ

文字列から部分一致検索
・strpos(‘検索対象の文字列’、’検索したい文字列’)
・str_contains(‘検索対象の文字列’、’検索したい文字列’) *PHP8以降

配列から部分一致検索
・preg_grep(‘検索したい文字列’、’検索対象の文字列’)