PR

【PHP】特定の単語/文字列までを切り出す

ある文字列に対して「この単語まで」を切り出したい場合のメモ。

指定した単語/文字列までを切り出す

日本語(マルチバイト文字列)を扱う場合は2つの関数があります。
(文字化けを防ぐために「mb_」がついた関数を使用するのが安全)

  • mb_strstr() 関数:大文字小文字を区別する
  • mb_stristr() 関数:大文字小文字を区別しない
PHP
string mb_strstr ( $target_string, $needle, $before_needle) //大文字小文字を区別する
string mb_stristr ( $target_string, $needle, $before_needle) //大文字小文字を区別しない

// ※PHP 8.0以降、検索する単語($needle)が空文字列の場合は ValueError が発生します。
Jin Simple Code Block
$target_string検索対象の文字列を指定
$needle検索する文字列。「この単語まで」の文字列を指定
$before_needletrue 指定で、 $target_string 中の最初の $needle の直前までの文字列を返す
戻り値$needleが見つかった場合:文字列を返す
$needle が見つからなかった場合: false を返します。

phpマニュアル:mb_strstr
phpマニュアル:mb_stristr

このstrstr() / stristr()関数は、「指定した単語の直前まで」の文字列を返すので、「指定した単語まで含める」場合には戻り値の最後に「指定した単語」($needle) を足せばよいことになります。

【サンプル:strstr()の例】

PHP
$target_string 	= "こんにちは。今日は良い天気ですね";
$needle = "天気";

$string_before_needle    = mb_strstr ( $target_string, $needle, true);    

// $needle が見つかった場合のみ、後ろに $needle を付け足す
$string_up_to_needle    = ($string_before_needle !== false) ? $string_before_needle . $needle : false;
Jin Simple Code Block

4行目:$needle 直前までの文字列の切り出し
5行目:$needle を最後に足して、$needle までの文字列を取り出し

【結果】

  • string_before_needle:「こんにちは。今日は良い」
    (検索する文字列「天気」の直前までが取り出せた)
  • string_up_to_needle:「こんにちは。今日は良い天気」
    (検索する文字列「天気」までが取り出せた)

【注意ポイント】falseが返ることを忘れずに

strstr() / stristr()関数は、対象文字列中に検索する単語がない場合には、false を返すようになってます。

明らかにその単語が対象文字列中にある、という場合は良いですが、
基本的には false の場合の処理も書いておくのが良いですね。
(思わぬところでエラーにならないように)

PHP
// 文字列中に対象の単語がなかった場合にはfalseを返す例

function get_string_upto_needle( $target_string , $needle ){
	// 日本語対応の mb_strstr を使用
	$string_before_needle	= mb_strstr ( $target_string, $needle, true);	

	// 厳密に false かどうかをチェック
	if( $string_before_needle === false ){
		// エラーメッセージを表示する例
		echo '検索対象の文字列「'.$needle.'」は見つかりませんでした';
		
		// 返り値をfalseにしておく
		$result = false;
	}
	else{
		// 検索対象文字列($needle)が見つかった場合
		// 最後に $needle を付ける
		$result	= $string_before_needle . $needle;
	}

	return $result;
}
Jin Simple Code Block

よりシンプルにしたい場合には、
三項演算子とか使うと良さそうです。

PHP
// 三項演算子を使ったシンプルな例

function get_string_upto_needle( $target_string , $needle ){
	$string_before_needle = mb_strstr ( $target_string, $needle, true);	
	
	// 厳密な比較(!== false)を行うことで、先頭一致(空文字)の場合も正しく処理できる
	return ($string_before_needle !== false) ? $string_before_needle . $needle : false ;
}
Jin Simple Code Block

文字列中の「この単語まで」を返す関数がないか探しましたが無いようなので、
とりあえずこうした形にしてみるか、と、ご参考までにのメモでした。

早期退職して海外で奮闘する JIN のメールマガジン

時間や場所に縛られず稼いだJINが教える

~ 最短で月収10万円稼げるようになる方法 ~

お名前/ニックネーム

隣のあの人にも、思わず教えたくなる秘密

配信停止は、いつでもできます

迷惑メールは一切配信されませんので、ご安心くださいね

自らの手で未来を変える力を手に入れる!

コメント