ある文字列に対して「この単語まで」を切り出したい場合のメモ。
指定した単語/文字列までを切り出す
日本語(マルチバイト文字列)を扱う場合は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_needle | : | true 指定で、 $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
文字列中の「この単語まで」を返す関数がないか探しましたが無いようなので、
とりあえずこうした形にしてみるか、と、ご参考までにのメモでした。


コメント