PHP8.0で、特定の文字列から始まる文字列か? 特定の文字列で終わる文字列か?を判定する関数が追加されました。
str_starts_with() と str_ends_with() 。
これまでだったら正規表現を使って判定するところですが、この2パターンの文字列チェックは正規表現なしでできるようになりました。
〇〇で始まる文字列かをチェックする - str_starts_with()
str_starts_with() は正規表現がいらないので、指定するものは対象文字列と開始文字列の2つだけです。
どれだけかんたんになったかを見るために、preg_match() で正規表現を使った同じ処理も一緒に見てみましょう。
$str = 'abcdefg';
// 開始文字列が一致
$start = 'abc';
$result = str_starts_with($str, $start);
if ($result) {
echo 'string start with ' . "'" . $start . "'" . PHP_EOL;
}
$pattern = '/' . $start . '.*/';
$result = preg_match($pattern, $str);
if ($result) {
echo 'string start with ' . "'" . $start . "'" . PHP_EOL;
}
// 開始文字列が不一致
$start = 'ac';
$result = str_starts_with($str, $start);
if (!$result) {
echo 'string not start with ' . "'" . $start . "'" . PHP_EOL;
}
$pattern = '/' . $start . '.*/';
$result = preg_match($pattern, $str);
if (!$result) {
echo 'string not start with ' . "'" . $start . "'" . PHP_EOL;
}
string start with 'abc'
string start with 'abc'
string not start with 'ac'
string not start with 'ac'
戻り値は true or false なので判断しやすい。
正規表現が苦手だったりよく分からなかったりしてもすぐに使えます。
preg_matchの戻り値は少し複雑。
一致: 1
不一致: 0
処理エラー: false
なので、上記サンプルコードの判定では、不一致とエラーの区別がつかない。
(実際のコード実装ではif文で詳細な区別が必要。)
〇〇で終わる文字列かをチェックする - str_ends_with()
文字列の末尾が指定文字列かどうかの関数も同時に追加されたので、それも見てみましょう。
同じく、preg_match() で正規表現を使ったものも一緒に。
$str = 'xyzabc';
// 文字列の末尾が一致
$end = 'abc';
$result = str_ends_with($str, $end);
if ($result) {
echo 'string end with ' . "'" . $end . "'" . PHP_EOL;
}
$pattern = '/.*' . $end . '/';
$result = preg_match($pattern, $str);
if ($result) {
echo 'string end with ' . "'" . $end . "'" . PHP_EOL;
}
// 文字列の末尾が不一致
$end = 'ac';
$result = str_ends_with($str, $end);
if (!$result) {
echo 'string not end with ' . "'" . $end . "'" . PHP_EOL;
}
$pattern = '/.*' . $end . '/';
$result = preg_match($pattern, $str);
if (!$result) {
echo 'string not end with ' . "'" . $end . "'" . PHP_EOL;
}
string end with 'abc'
string end with 'abc'
string not end with 'ac'
string not end with 'ac'
このサンプルコードは、str_starts_with() のサンプルコード内すべてを 'start' で検索して 'end' に置換しただけのものです。
(そのほか $str のテスト値とコメント、出力文言、preg_match() の正規表現を変えた。)
それくらい、str_starts_with() と str_ends_with() の使い方は同じ。
この2つは同時に覚えましょう。関数名も似ていて意味がそのままなので覚えやすいはず。
日本語(全角文字)などマルチバイト文字でも使える
忘れるところでした。日本語の文字列でも使えます。
$str = '田中さん。こんにちは。';
$start = '田中';
$result = str_starts_with($str, $start);
if ($result) {
echo 'string start with ' . "'" . $start . "'" . PHP_EOL;
}
$start = '佐藤';
$result = str_starts_with($str, $start);
if (!$result) {
echo 'string not start with ' . "'" . $start . "'" . PHP_EOL;
}
string start with '田中'
string not start with '佐藤'
$str = 'by 山田';
$end = '山田';
$result = str_ends_with($str, $end);
if ($result) {
echo 'string end with ' . "'" . $end . "'" . PHP_EOL;
}
$end = '五十嵐';
$result = str_ends_with($str, $end);
if (!$result) {
echo 'string not end with ' . "'" . $end . "'" . PHP_EOL;
}
string end with '山田'
string not end with '五十嵐'