PHPの文字列の部分一致の判定方法について

採用はこちら

PHPで文字列の部分一致を判定したい場合は、指定した文字列が、対象の文字列の中に含まれているかを調べます。

たとえば、次のようなケースです。

$text = 'PHPで文字列の部分一致を判定します';

この文字列の中に「部分一致」という文字が含まれているかを判定したい場合、PHP 8.0以降であれば str_contains() を使うのが基本です。

$text = 'PHPで文字列の部分一致を判定します';

if (str_contains($text, '部分一致')) {
    echo '含まれています';
} else {
    echo '含まれていません';
}

str_contains() は、検索対象の文字列に指定した文字列が含まれていれば true、含まれていなければ false を返します。

PHP 8.0以降の環境で、単純に「含まれているかどうか」を判定したい場合は、まず str_contains() を使うとよいでしょう。

目次

PHP 8.0以降ではstr_contains()を使う

str_contains()の基本構文

str_contains() の基本構文は次のとおりです。

str_contains(検索対象の文字列, 探したい文字列)

実際のコードでは、次のように書きます。

str_contains($haystack, $needle);

それぞれの意味は次のとおりです。

引数内容
$haystack検索対象の文字列
$needle探したい文字列

たとえば、次のコードでは、$message の中に「お問い合わせ」という文字列が含まれているかを判定しています。

$message = 'お問い合わせありがとうございます。';

if (str_contains($message, 'お問い合わせ')) {
    echo '問い合わせ関連の文章です';
}

「お問い合わせ」という文字列が含まれているため、条件式は true になります。

str_contains()の戻り値

str_contains() は、結果を真偽値で返します。

var_dump(str_contains('Hello World', 'World')); // bool(true)
var_dump(str_contains('Hello World', 'PHP'));   // bool(false)

WorldHello World の中に含まれているため true です。

一方、PHP は含まれていないため false になります。

このように、str_contains() は「含まれているかどうか」をそのまま判定できるため、コードの意図がわかりやすいのが特徴です。

str_contains()は大文字・小文字を区別する

大文字と小文字は別の文字として扱われる

str_contains() は、大文字と小文字を区別します。

var_dump(str_contains('Hello World', 'Hello')); // bool(true)
var_dump(str_contains('Hello World', 'hello')); // bool(false)

Hello は含まれていますが、hello は含まれていません。

先頭の Hh が異なるためです。

そのため、英字を含む文字列で、大文字・小文字を区別せずに判定したい場合は注意が必要です。

大文字・小文字を無視して判定する方法

大文字・小文字を無視して部分一致を判定したい場合は、いくつか方法があります。

英字のみを想定する場合は、stripos() を使う方法がシンプルです。

$text = 'Hello World';
$keyword = 'hello';

if (stripos($text, $keyword) !== false) {
    echo '含まれています';
}

stripos() は、strpos() の大文字・小文字を区別しない版です。

ただし、strpos() と同じく、見つかった位置を整数で返し、見つからなかった場合は false を返します。

そのため、判定するときは必ず次のように書きます。

stripos($text, $keyword) !== false

次のように書くと、先頭で一致した場合に誤判定する可能性があります。

// 非推奨
if (stripos($text, $keyword)) {
    echo '含まれています';
}

stripos() は先頭で見つかった場合に 0 を返します。

PHPでは 0false のように扱われるため、正しく判定できません。

mb_strtolower()を使って判定する方法

日本語を含む文章や、マルチバイト文字を扱う可能性がある場合は、mb_strtolower() を使って小文字化してから判定する方法もあります。

$text = 'Hello World';
$keyword = 'hello';

if (str_contains(
    mb_strtolower($text, 'UTF-8'),
    mb_strtolower($keyword, 'UTF-8')
)) {
    echo '含まれています';
}

この方法では、検索対象と検索キーワードの両方を小文字に変換してから str_contains() で判定しています。

なお、日本語そのものには、英語のような大文字・小文字の区別は基本的にありません。

ただし、日本語の文章中に英字や全角英字が含まれる場合は、mb_strtolower() を使うとより安全です。

PHP 7以前ではstrpos()を使う

strpos()による部分一致判定

PHP 7以前では str_contains() が使えません。

そのため、PHP 7以前にも対応する必要がある場合は、strpos() を使います。

$text = 'PHPで文字列の部分一致を判定します';

if (strpos($text, '部分一致') !== false) {
    echo '含まれています';
} else {
    echo '含まれていません';
}

strpos() は、検索対象の文字列の中で、指定した文字列が最初に現れる位置を返します。

見つからなかった場合は false を返します。

strpos()では必ず!== falseで判定する

strpos() を使う場合に重要なのが、必ず !== false で判定することです。

次の書き方は避けましょう。

// 非推奨
if (strpos($text, 'PHP')) {
    echo '含まれています';
}

この書き方では、検索文字列が先頭にある場合に正しく判定できません。

たとえば、次のコードを見てください。

$text = 'PHPで学ぶ';

var_dump(strpos($text, 'PHP')); // int(0)

PHP は文字列の先頭にあるため、strpos()0 を返します。

しかし、PHPの条件式では 0false と同じように扱われることがあります。

そのため、次のように書く必要があります。

$text = 'PHPで学ぶ';

if (strpos($text, 'PHP') !== false) {
    echo '含まれています';
} else {
    echo '含まれていません';
}

!== false と厳密比較することで、位置を表す 0 と、見つからなかった場合の false を区別できます。

str_contains()とstrpos()の違い

判定だけならstr_contains()がわかりやすい

str_contains()strpos() は、どちらも文字列の部分一致に使えます。

ただし、目的が少し異なります。

関数主な目的戻り値
str_contains()含まれているかを判定するtrue / false
strpos()最初に現れる位置を調べる位置を表す整数 / false

単純に「含まれているかどうか」を知りたい場合は、str_contains() のほうが読みやすいです。

if (str_contains($text, 'PHP')) {
    echo '含まれています';
}

一方で、見つかった位置も使いたい場合は strpos() を使います。

$position = strpos($text, 'PHP');

if ($position !== false) {
    echo '見つかった位置: ' . $position;
}

PHP 8.0以降で、部分一致の有無だけを判定するなら str_contains()、位置も必要なら strpos() と使い分けるとよいでしょう。

日本語の部分一致を判定する方法

日本語でもstr_contains()は使える

日本語の文字列でも、単純に「含まれているかどうか」を判定するだけなら、str_contains() を使えます。

$text = 'これは日本語の文章です';

if (str_contains($text, '日本語')) {
    echo '含まれています';
}

このコードでは、$text の中に「日本語」が含まれているため、条件式は true になります。

ただし、str_contains() は文字列をバイト列として検索します。

そのため、検索対象と検索キーワードの文字コードが一致していることが前提です。

一般的なWebサイトではUTF-8で統一されていることが多いため、日本語の単純な部分一致で問題になるケースは多くありません。

しかし、検索対象がUTF-8で、検索キーワードがShift_JISのように文字コードが混在している場合は、正しく判定できない可能性があります。

日本語を扱う場合は、文字コードをUTF-8に統一しておくと安心です。

日本語で位置を取得するならmb_strpos()を使う

日本語の文字列で「何文字目に含まれているか」を知りたい場合は、mb_strpos() を使います。

$text = 'こんにちは世界';

$position = mb_strpos($text, '世界');

if ($position !== false) {
    echo '見つかった位置: ' . $position;
}

strpos() はバイト単位の位置を返します。

一方、mb_strpos() はマルチバイト文字に対応しており、文字数ベースで位置を扱えます。

たとえば、UTF-8では日本語1文字が複数バイトで表現されます。

そのため、strpos() の戻り値は「何文字目か」とは一致しないことがあります。

日本語で位置情報まで扱う場合は、mb_strpos() を使うとよいでしょう。

複数のキーワードのどれかが含まれるか判定する

foreachで判定する方法

複数のキーワードのうち、どれか1つでも含まれているかを判定したい場合は、配列と foreach を使うとわかりやすいです。

$text = 'WordPressでサイトを制作します';
$keywords = ['PHP', 'Laravel', 'WordPress'];

$matched = false;

foreach ($keywords as $keyword) {
    if ($keyword === '') {
        continue;
    }

    if (str_contains($text, $keyword)) {
        $matched = true;
        break;
    }
}

if ($matched) {
    echo 'いずれかのキーワードが含まれています';
} else {
    echo 'キーワードは含まれていません';
}

この例では、WordPress が含まれているため、$matchedtrue になります。

また、キーワードに空文字が含まれている場合に備えて、次の処理を入れています。

if ($keyword === '') {
    continue;
}

str_contains() は空文字を検索すると true を返します。

そのため、実務では空文字を除外しておくと安全です。

関数化して使いやすくする

複数キーワードの判定は、関数化しておくと便利です。

function containsAny(string $text, array $keywords): bool
{
    foreach ($keywords as $keyword) {
        if ($keyword === '') {
            continue;
        }

        if (str_contains($text, $keyword)) {
            return true;
        }
    }

    return false;
}

使い方は次のとおりです。

$text = 'WordPressでサイトを制作します';

if (containsAny($text, ['PHP', 'Laravel', 'WordPress'])) {
    echo 'いずれかのキーワードが含まれています';
}

この関数は、配列内のキーワードのうち1つでも含まれていれば true を返します。

どれも含まれていなければ false を返します。

複数のキーワードがすべて含まれるか判定する

すべて含まれるかを確認する関数

「複数のキーワードのどれか」ではなく、「すべてのキーワードが含まれているか」を判定したい場合もあります。

その場合は、次のような関数を使えます。

function containsAll(string $text, array $keywords): bool
{
    foreach ($keywords as $keyword) {
        if ($keyword === '') {
            continue;
        }

        if (!str_contains($text, $keyword)) {
            return false;
        }
    }

    return true;
}

使用例は次のとおりです。

$text = 'PHPとLaravelを使ってWebアプリを開発します';

if (containsAll($text, ['PHP', 'Laravel'])) {
    echo 'すべてのキーワードが含まれています';
}

このコードでは、PHPLaravel の両方が含まれているため、条件式は true になります。

空文字の扱いには注意する

上の例では、空文字のキーワードを無視しています。

if ($keyword === '') {
    continue;
}

ただし、空文字を無視するか、エラーとして扱うかは仕様によって変わります。

検索フォームのように、ユーザー入力からキーワードを受け取る場合は、空文字を除外することが多いです。

一方、必須の検索条件として扱う場合は、空文字が入っていた時点でエラーにする設計も考えられます。

実務では、次のように事前に空文字を取り除く方法もあります。

$keywords = array_filter($keywords, fn($keyword) => $keyword !== '');

配列の中から部分一致する要素を抽出する

foreachで抽出する方法

配列の中から、特定の文字列を含む要素だけを取り出したい場合もあります。

$items = [
    'HTMLの基礎',
    'CSSの書き方',
    'PHPの入門',
    'JavaScriptの基本',
];

$matchedItems = [];

foreach ($items as $item) {
    if (str_contains($item, 'PHP')) {
        $matchedItems[] = $item;
    }
}

print_r($matchedItems);

実行結果は次のようになります。

Array
(
    [0] => PHPの入門
)

array_filter()で抽出する方法

array_filter() を使うと、より簡潔に書けます。

$items = [
    'HTMLの基礎',
    'CSSの書き方',
    'PHPの入門',
    'JavaScriptの基本',
];

$matchedItems = array_filter($items, function ($item) {
    return str_contains($item, 'PHP');
});

print_r($matchedItems);

アロー関数を使うと、さらに短く書けます。

$matchedItems = array_filter(
    $items,
    fn($item) => str_contains($item, 'PHP')
);

ただし、array_filter() は元の配列のキーを保持します。

連番の配列として扱いたい場合は、array_values() を使います。

$matchedItems = array_values(array_filter(
    $items,
    fn($item) => str_contains($item, 'PHP')
));

配列をJSONで返す場合など、キーのずれを避けたい場面では array_values() を使うとよいでしょう。

先頭一致・後方一致との違い

部分一致・先頭一致・後方一致の違い

文字列の判定には、部分一致のほかに、先頭一致や後方一致もあります。

判定方法意味
部分一致文字列のどこかに含まれるabcb が含まれる
先頭一致指定した文字列で始まるabca で始まる
後方一致指定した文字列で終わるabcc で終わる

PHP 8.0以降では、それぞれ次の関数を使えます。

$text = 'https://example.com';

var_dump(str_contains($text, 'example'));      // 部分一致
var_dump(str_starts_with($text, 'https://'));  // 先頭一致
var_dump(str_ends_with($text, '.com'));        // 後方一致

部分一致を使えば幅広く判定できますが、目的によっては先頭一致や後方一致を使ったほうが意図が明確になります。

URLやファイル名では専用の判定を使う

たとえば、URLが https:// で始まるかを調べたい場合は、str_contains() より str_starts_with() のほうが適しています。

$url = 'https://example.com';

if (str_starts_with($url, 'https://')) {
    echo 'HTTPSのURLです';
}

ファイル名の拡張子を判定したい場合は、str_ends_with() が向いています。

$filename = 'report.pdf';

if (str_ends_with($filename, '.pdf')) {
    echo 'PDFファイルです';
}

一方、ファイル名のどこかに特定の文字列が含まれているかを調べたい場合は、str_contains() を使います。

$filename = 'report_2026_final.pdf';

if (str_contains($filename, 'final')) {
    echo '最終版のファイルです';
}

このように、目的に応じて関数を使い分けると、読みやすいコードになります。

正規表現で部分一致を判定する

preg_match()を使うケース

単純な文字列の部分一致であれば、str_contains() で十分です。

しかし、特定のパターンに一致するかを調べたい場合は、preg_match() を使います。

たとえば、文字列に数字が含まれているかを判定する場合は、次のように書けます。

$text = '商品番号はABC123です';

if (preg_match('/\d/', $text)) {
    echo '数字が含まれています';
}

\d は数字を表す正規表現です。

この例では、123 が含まれているため、条件式は true になります。

複数パターンをまとめて判定する

複数のキーワードを正規表現でまとめて判定することもできます。

$text = 'LaravelでWebアプリを開発します';

if (preg_match('/PHP|Laravel|WordPress/', $text)) {
    echo 'いずれかのキーワードが含まれています';
}

この例では、PHPLaravelWordPress のいずれかが含まれているかを判定しています。

ただし、単純なキーワード検索であれば、str_contains() を使ったほうが読みやすいことも多いです。

if (str_contains($text, 'Laravel')) {
    echo 'Laravelが含まれています';
}

正規表現は便利ですが、必要以上に使うとコードが読みにくくなる場合があります。

単純な部分一致なら str_contains()、パターン判定なら preg_match() と使い分けるとよいでしょう。

メールアドレスらしき文字列を検出する例

本文中にメールアドレスらしき文字列が含まれているかを調べる場合は、正規表現を使えます。

$text = '連絡先は test@example.com です';

if (preg_match('/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/', $text)) {
    echo 'メールアドレスらしき文字列が含まれています';
}

この例は、メールアドレスらしき文字列を簡易的に検出するためのものです。

厳密にメールアドレスとして妥当かを検証したい場合は、filter_var() の利用も検討します。

$email = 'test@example.com';

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo '有効なメールアドレスです';
}

本文中からメールアドレスらしき文字列を探す場合は preg_match()、入力されたメールアドレスそのものを検証する場合は filter_var()、というように目的を分けて考えるとよいです。

フォーム入力値に特定の文字列が含まれるか判定する

$_POSTの値を判定する例

お問い合わせフォームなどで、入力された文章に特定のキーワードが含まれているかを判定することがあります。

$input = $_POST['message'] ?? '';

if (str_contains($input, 'キャンセル')) {
    echo 'キャンセルに関する問い合わせです';
}

この例では、フォームの message に「キャンセル」という文字列が含まれているかを判定しています。

$_POST['message'] ?? '' と書くことで、message が存在しない場合でも空文字として扱えます。

入力値を表示するときはエスケープする

str_contains() は、文字列にキーワードが含まれるかを判定するための関数です。

一方、ユーザー入力をHTMLに表示する場合は、XSS対策としてエスケープが必要です。

$input = $_POST['message'] ?? '';

echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');

判定処理と出力時の安全対策は、分けて考えることが大切です。

$input = $_POST['message'] ?? '';

if (str_contains($input, 'キャンセル')) {
    echo 'キャンセルに関する問い合わせです';
}

echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');

ユーザー入力をそのままHTMLに出力すると、意図しないスクリプトが実行される可能性があります。

フォーム入力値を画面に表示する場合は、htmlspecialchars() などで適切にエスケープしましょう。

URLに特定の文字列が含まれるか判定する

URL全体を判定する例

URLの中に特定の文字列が含まれているかを判定する場合も、str_contains() を使えます。

$url = 'https://example.com/products/detail/123';

if (str_contains($url, '/products/')) {
    echo '商品ページです';
}

この例では、URLの中に /products/ が含まれているため、商品ページとして判定しています。

パスだけを取り出して判定する例

URL全体ではなく、パス部分だけを判定したい場合は、parse_url() を使うとよいです。

$url = 'https://example.com/products/detail/123?ref=google';

$path = parse_url($url, PHP_URL_PATH) ?? '';

if (str_contains($path, '/products/')) {
    echo '商品ページです';
}

parse_url($url, PHP_URL_PATH) によって、URLのパス部分だけを取得できます。

この例では、次の部分が取得されます。

/products/detail/123

また、parse_url() の結果が null になる可能性もあるため、次のように ?? '' を付けておくと安全です。

$path = parse_url($url, PHP_URL_PATH) ?? '';

URLの構造に応じて判定したい場合は、単純な部分一致だけでなく、parse_url() を組み合わせると扱いやすくなります。

WordPressで文字列の部分一致を判定する

WordPressでstr_contains()を使う場合の注意点

WordPressのテーマやプラグイン開発でも、文字列の部分一致判定を使うことがあります。

たとえば、現在のURLに特定の文字列が含まれているかを判定する場合です。

$current_url = home_url(add_query_arg([], $_SERVER['REQUEST_URI']));

if (str_contains($current_url, '/column/')) {
    echo 'コラムページです';
}

ただし、str_contains() はPHP 8.0以降で使える関数です。

WordPress案件ではサーバーのPHPバージョンが環境によって異なることがあるため、PHP 7系にも対応する必要がある場合は strpos() を使います。

$current_url = home_url(add_query_arg([], $_SERVER['REQUEST_URI']));

if (strpos($current_url, '/column/') !== false) {
    echo 'コラムページです';
}

WordPressで str_contains() を使う場合は、サーバーのPHPバージョンが8.0以上であることを確認しましょう。

WordPressでは条件分岐タグを優先する

WordPressでは、URL文字列を直接判定するよりも、条件分岐タグを使ったほうが適切な場合があります。

たとえば、投稿詳細ページかどうかを判定したい場合は、次のように書けます。

if (is_single()) {
    echo '投稿詳細ページです';
}

固定ページを判定したい場合は、is_page() を使います。

if (is_page()) {
    echo '固定ページです';
}

投稿タイプを判定したい場合は、is_singular() を使えます。

if (is_singular('post')) {
    echo '投稿ページです';
}

URL文字列の部分一致でも判定はできますが、WordPressが用意している条件分岐タグを使える場合は、そちらを優先したほうが安全で読みやすいコードになります。

スラッグに特定の文字列が含まれるか判定する

投稿のスラッグに特定の文字列が含まれているかを判定したい場合は、投稿オブジェクトを取得して判定できます。

$post = get_post();

if ($post && str_contains($post->post_name, 'campaign')) {
    echo 'キャンペーン関連の投稿です';
}

PHP 7系にも対応したい場合は、次のように書きます。

$post = get_post();

if ($post && strpos($post->post_name, 'campaign') !== false) {
    echo 'キャンペーン関連の投稿です';
}

WordPressでは、PHPバージョンや使用環境を考慮して、str_contains()strpos() を使い分けることが大切です。

空文字を検索した場合の注意点

str_contains()で空文字を検索するとtrueになる

str_contains() では、空文字 '' を検索すると true が返ります。

var_dump(str_contains('abc', '')); // bool(true)

これは、どの文字列にも空文字は含まれていると考えられるためです。

ただし、検索機能やフォーム入力では、検索キーワードが空のときに一致扱いになると困る場合があります。

検索キーワードが空の場合は除外する

実務では、検索キーワードが空文字でないことを確認してから判定するのがおすすめです。

$text = 'PHPの学習';
$keyword = '';

if ($keyword !== '' && str_contains($text, $keyword)) {
    echo '含まれています';
} else {
    echo '検索キーワードが空、または含まれていません';
}

このように書くことで、空文字による意図しない一致を防げます。

検索フォームでは、入力値の前後に空白が入ることもあります。

その場合は、trim() を使って空白を取り除いてから判定するとよいです。

$text = 'PHPの学習';
$keyword = trim($_GET['keyword'] ?? '');

if ($keyword !== '' && str_contains($text, $keyword)) {
    echo '含まれています';
}

実務で使いやすい部分一致判定の関数

基本的なcontains()関数

部分一致の判定を何度も使う場合は、関数化しておくと便利です。

function contains(string $text, string $keyword): bool
{
    if ($keyword === '') {
        return false;
    }

    return str_contains($text, $keyword);
}

使い方は次のとおりです。

$text = 'PHPで文字列検索を行います';

if (contains($text, '文字列検索')) {
    echo '含まれています';
}

この関数では、検索キーワードが空文字の場合に false を返すようにしています。

これにより、空文字による意図しない一致を防げます。

大文字・小文字を無視するcontainsIgnoreCase()関数

大文字・小文字を無視して判定したい場合は、次のような関数を用意できます。

function containsIgnoreCase(string $text, string $keyword): bool
{
    if ($keyword === '') {
        return false;
    }

    return str_contains(
        mb_strtolower($text, 'UTF-8'),
        mb_strtolower($keyword, 'UTF-8')
    );
}

使用例です。

$text = 'Hello World';

if (containsIgnoreCase($text, 'hello')) {
    echo '含まれています';
}

この関数では、検索対象と検索キーワードをどちらも小文字に変換してから判定しています。

英字を含む文字列で、大文字・小文字を区別せずに判定したい場合に使えます。

目的別の使い分け

文字列の部分一致で使う主な関数

PHPで文字列の部分一致を判定する場合は、目的に応じて関数を使い分けることが大切です。

やりたいことおすすめの方法
文字列が含まれているか判定したいstr_contains()
PHP 7以前でも動かしたいstrpos($text, $keyword) !== false
見つかった位置も知りたいstrpos()
日本語で文字位置も正確に扱いたいmb_strpos()
大文字・小文字を無視したいstripos() または mb_strtolower() + str_contains()
パターンで判定したいpreg_match()
指定文字列で始まるか判定したいstr_starts_with()
指定文字列で終わるか判定したいstr_ends_with()

PHP 8.0以降で、単純に部分一致の有無を判定するだけなら、str_contains() が最もわかりやすいです。

if (str_contains($text, $keyword)) {
    echo '含まれています';
}

PHP 7以前に対応する必要がある場合は、strpos() を使います。

if (strpos($text, $keyword) !== false) {
    echo '含まれています';
}

よくある間違い

strpos()の結果をそのままifに入れる

strpos() を使うときによくある間違いが、戻り値をそのまま if に入れてしまうことです。

// 非推奨
if (strpos($text, 'PHP')) {
    echo '含まれています';
}

この書き方では、検索文字列が先頭にある場合に正しく判定できません。

正しくは、次のように !== false を使います。

if (strpos($text, 'PHP') !== false) {
    echo '含まれています';
}

strpos() は、見つかった位置を整数で返します。

先頭で見つかった場合は 0 を返すため、false と区別する必要があります。

単純な部分一致に正規表現を使う

単純に特定の文字列が含まれているかを調べたいだけなら、正規表現を使う必要はありません。

// やや大げさ
if (preg_match('/PHP/', $text)) {
    echo '含まれています';
}

この場合は、次のように str_contains() を使ったほうがわかりやすいです。

if (str_contains($text, 'PHP')) {
    echo '含まれています';
}

正規表現は、パターン判定が必要な場合に使うと効果的です。

単純な部分一致では、str_contains() のほうが読みやすく、意図も伝わりやすいです。

空文字を検索してしまう

検索キーワードが空文字の場合、str_contains()true を返します。

$keyword = '';

if (str_contains($text, $keyword)) {
    echo '含まれています';
}

このコードでは、意図せず一致扱いになる可能性があります。

実務では、次のように空文字チェックを入れると安全です。

if ($keyword !== '' && str_contains($text, $keyword)) {
    echo '含まれています';
}

検索フォームや絞り込み機能を作る場合は、空文字の扱いを事前に決めておきましょう。

まとめ

PHPで文字列の部分一致を判定する場合、PHP 8.0以降であれば str_contains() を使うのが基本です。

if (str_contains($text, $keyword)) {
    echo '含まれています';
}

str_contains() は、指定した文字列が含まれているかどうかを true / false で返すため、コードの意図がわかりやすい関数です。

PHP 7以前にも対応する必要がある場合は、strpos() を使います。

if (strpos($text, $keyword) !== false) {
    echo '含まれています';
}

strpos() を使う場合は、必ず !== false で判定しましょう。

検索文字列が先頭にある場合、strpos()0 を返すため、通常の if 判定では誤判定する可能性があります。

日本語の単純な部分一致であれば、文字コードが統一されていれば str_contains() を使えます。

ただし、日本語で「何文字目に含まれているか」を扱いたい場合は、mb_strpos() を使うのが適切です。

目的別に整理すると、次のように使い分けるとよいでしょう。

目的使用する関数
部分一致の有無を判定するstr_contains()
PHP 7以前に対応するstrpos()
大文字・小文字を無視するstripos()
日本語の文字位置を取得するmb_strpos()
パターンで判定するpreg_match()
先頭一致を判定するstr_starts_with()
後方一致を判定するstr_ends_with()

部分一致の判定は、WebアプリやWordPressのテーマ開発、フォーム処理、検索機能などでよく使います。

PHPのバージョンや判定したい内容に合わせて、適切な関数を選ぶことが大切です。

以上、PHPの文字列の部分一致の判定方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次