文章中からキーワードの現れる最初の位置を調べるなら mb_strpos() が使えますが、取得できるのは一つだけなので、同じキーワードが複数回出現している場合でも最初に見つかった一つしか得られません。
そこで、語句が出現する全ての位置を取得して配列の形で返す関数を作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php mb_internal_encoding( 'utf-8' ); $needle = 'テスト' ; $haystack = 'これはテストです。二箇所目のテストです。三箇所目のテストです' ; $result = mb_strpos_all( $haystack , $needle ); print_r( $result ); function mb_strpos_all( $haystack , $needle , $offset =0, $encoding =null, $result = array () ){ if ( empty ( $encoding ) ) $encoding = mb_internal_encoding(); $pos = mb_strpos( $haystack , $needle , $offset , $encoding ); if ( $pos !== false){ $result [] = $pos ; return mb_strpos_all( $haystack , $needle , $pos + 1, $encoding , $result ); } else { return $result ; } } |
出力結果: Array ( [0] => 3 [1] => 14 [2] => 25 )
キーワードとなる語句は 3 回使われているので結果の配列も 3 つです。数値は何文字目に現れるかを示しており、3 文字目、14 文字目、25 文字目に単語が存在することがわかります。
上記の例では再帰処理を行いましたが単純に下のようにしても同じ結果が得られます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php mb_internal_encoding( 'utf-8' ); $needle = 'テスト' ; $haystack = 'これはテストです。二箇所目のテストです。三箇所目のテストです' ; $offset = 0; $result = array (); while (true){ $pos = mb_strpos( $haystack , $needle , $offset ); if ( $pos === false){ break ; } else { $result [] = $pos ; $offset = $pos + 1; } } print_r( $result ); |
Similar Posts:
- [PHP]htmlspecialchars()を行った上でprintf()する
- [PHP]料金表のようなものをテキストだけで表現する
- [PHP][JS, Ajax]郵便番号を住所に変換する
- PHP で XML の内容を取得する(DOM, XPath)
- [PHP]最低限覚えておきたい必須関数一覧
- [PHP]JSON+cURLで時刻同期型ワンタイムパスワードによる認証
- [PHP]FTPでアップロードやダウンロード等のファイル操作を行う
- [PHP]ひらがな・カタカナをローマ字に変換する