【PHP】文字列の先頭一致と末尾一致を確認する方法
更新日:2023/03/21
PHPで文字列が指定された文字列で始まるか(先頭一致)または、指定された文字列で終わるか(末尾一致)を確認する方法を解説します。
また、大文字小文字の区別なしで先頭一致と末尾一致を確認する方法もお伝えします。
PHP8以降の場合
PHPのバージョンが8以降に限定できるなら、先頭一致と末尾一致の確認にstr_starts_with()またはstr_ends_with()を使用できます。
str_starts_with()、str_ends_with()の使い方
先頭一致: str_starts_with( 文字列 , 指定された文字列 ) 末尾一致: str_ends_with( 文字列 , 指定された文字列 )
戻り値はtrueまたはfalseです。
使用例
$text = 'Hello!この文字列は"先頭一致"と"後方一致"の"確認用"文字列です';
// 先頭一致の確認
echo str_starts_with( $text , 'Hello!' ) ? '一致' : '不一致';
// 結果 : 一致
// 後方一致の確認
echo str_ends_with( $text , '"確認用"文字列です' ) ? '一致' : '不一致';
// 結果 : 一致
大文字小文字を区別しないで確認
str_starts_with()とstr_ends_with()は、大文字小文字を区別します。
そのため、大文字小文字を区別しないで確認するときは大文字または小文字に統一してから関数を適用します。
$text = 'Hello!この文字列は先頭一致と後方一致の確認用文字列です';
// 先頭一致の確認
echo str_starts_with( strtoupper($text) , 'HELLO!' ) ? '一致' : '不一致';
PHP7以前の場合
str_starts_with()とstr_ends_with()はPHP8以降しか使用できません。
そのため、汎用的なコードを作成する場合は他の関数を使用します。
基本は文字列切り出し比較
基本的には、文字列から比較対象文字列のバイト数分だけ切り出して、比較します。
$text = 'Hello!この文字列は"先頭一致"と"後方一致"の"確認用"文字列です';
// 先頭一致の確認
$s1 = 'Hello!';
echo substr($text,0,strlen($s1)) === $s1 ? '一致' : '不一致';
// 結果 : 一致
// 後方一致の確認
$s2 = '"確認用"文字列です';
echo substr($text,-strlen($s2)) === $s2 ? '一致' : '不一致';
// 結果 : 一致
マルチバイトが含まれていますが、結局はバイト単位の比較なので気にしなくて大丈夫です。
先頭一致は、strncmp()を使用すると切り出し作業を行うことなく確認できます。
少しだけですが、こちらの方が効率がいいかもしれません。
// 先頭一致の確認
echo strncmp($text,$s1,strlen($s1)) === 0 ? '一致' : '不一致';
大文字小文字を区別しないで確認
大文字小文字を区別しないで先頭一致と後方一致の確認をするときは、切り出した文字を大文字または小文字に統一します。
// 先頭一致の確認
$s1 = 'HELLO!';
echo strtoupper(substr($text,0,strlen($s1))) === strtoupper($s1) ? '一致' : '不一致';
// または
echo strncmp(strtoupper($text),strtoupper($s1),strlen($s1)) === 0 ? '一致' : '不一致';
// 後方一致の確認
$s2 = '"確認用"文字列です';
echo strtoupper(substr($text,-strlen($s2))) === strtoupper($s2) ? '一致' : '不一致';
先頭一致のstrncmp()は、全体を大文字に変換した文字列を渡します。
そのため、切り出してから大文字化しているコードの方が効率がいいかもしれません。
str_starts_with()、str_ends_with()を使う
将来的にPHP8以降に移行した場合、str_starts_with()とstr_ends_with()を使う方法と使わない方法が入り混じる可能性があります。
そのため、PHP7以前でも先頭一致と末尾一致はstr_starts_with()とstr_ends_with()に統一しておいた方がよさそうです。
次のコードで、PHP7以前でもそれらの関数を使用できるようにします。
if( !function_exists('str_starts_with') ){
function str_starts_with( $haystack, $needle){
return strncmp($haystack,$needle,strlen($needle)) === 0;
}
}
if( !function_exists('str_ends_with') ){
function str_ends_with( $haystack, $needle){
return substr($haystack,-strlen($needle)) === $needle;
}
}
更新日:2023/03/21
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。