ある文字列に対して「この単語まで」を切り出したい場合のメモ。
指定した単語/文字列までを切り出す
まず「指定する単語」の「直前まで」を取り出すには
以下の2つの関数がありますね。
- strstr()関数:大文字小文字を区別する
- stristr()関数:大文字小文字を区別しない
1 2 |
string strstr ( $target_string, $needle, $before_needle) //大文字小文字を区別する string stristr ( $target_string, $needle, $before_needle) //大文字小文字を区別しない |
$target_string | : | 検索対象の文字列を指定 |
$needle | : | 検索する文字列。「この単語まで」の文字列を指定 |
$before_needle | : | true 指定で、 $target_string 中の最初の $needle の直前までの文字列を返す |
戻り値 | : | $needleが見つかった場合:文字列を返す $needle が見つからなかった場合: false を返します。 |
phpマニュアル:strstr
phpマニュアル:stristr
このstrstr() / stristr()関数は、「指定した単語の直前まで」の文字列を返すので、「指定した単語まで含める」場合には
戻り値の最後に「指定した単語」($needle) を足せばよいことになります。
【サンプル:strstr()の例】
1 2 3 4 5 |
$target_string = "こんにちは。今日は良い天気ですね"; $needle = "天気"; $string_before_needle = strstr ( $target_string, $needle, true); $string_up_to_needle = strstr ( $target_string, $needle, true).$needle; |
4行目:$needle 直前までの文字列の切り出し
5行目:$needle を最後に足して、$needle までの文字列を取り出し
【結果】
- string_before_needle:「こんにちは。今日は良い」
(検索する文字列「天気」の直前までが取り出せた) - string_up_to_needle:「こんにちは。今日は良い天気」
(検索する文字列「天気」までが取り出せた)
【注意ポイント】falseが返ることを忘れずに
strstr() / stristr()関数は、対象文字列中に検索する単語がない場合には、false を返すようになってます。
明らかにその単語が対象文字列中にある、という場合は良いですが、
基本的には false の場合の処理も書いておくのが良いですね。
(思わぬところでエラーにならないように)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// $target_string :検索対象文字列 // $needle :検索する単語 // $result :戻り値 // 文字列中に対象の単語がなかった場合にはfalseを返す例 function get_string_upto_needle( $target_string , $needle ){ $string_before_needle = strstr ( $target_string, $needle, true); // 検索対象文字列($needle)が見つからなかった場合 if( $string_before_needle == false ){ //エラーメッセージを表示する例 echo '検索対象の文字列'.$needle.'は見つかりませんでした'; //返り値をfalseにしておく例 $result = false; } else{ // 検索対象文字列($needle)が見つかった場合 // 最後に $needle を付ける $result = $string_before_needle . $needle; } return $result; } |
よりシンプルにしたい場合には、三項演算子とか使うと良さそうです。
1 2 3 4 5 6 7 8 |
// $target_string :検索対象文字列 // $needle :検索する単語 // 文字列中に対象の単語がなかった場合にはfalseを返す例 function get_string_upto_needle( $target_string , $needle ){ $string_before_needle = strstr ( $target_string, $needle, true); return $string_before_needle ? $string_before_needle . $needle : false ; } |
文字列中の「この単語まで」を返す関数がないか探しましたが無いようなので、
とりあえずこうした形にしてみるか、と、ご参考までにのメモでした。