[PHP]キーワードとなる文字列が何文字目にあるかを全て取得

Pocket

文章中からキーワードの現れる最初の位置を調べるなら 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:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です