PHP: поиск повторяющихся слов с текстом и без него

Я могу найти повторяющиеся слова в тексте с помощью этой функции:

$str = 'bob is a good person. mary is a good person. who is the best? are you a good person? bob is the best?'; function repeated($str) { $str=trim($str); $str=ereg_replace('[[:space:]]+', ' ',$str); $words=explode(' ',$str); foreach($words as $w) { $wordstats[($w)]++; } foreach($wordstats as $k=>$v) { if($v>=2) { print "$k"." , "; } } } 

вот почему:

 bob , good , person , is , a , the , best? 

Q: как я могу получить результат повторных слов и многочастные слова между пространством выглядят так:

 bob , good , person , is , a , the , best? , good person , is a , a good , is the , bob is 

 <?php $str = 'bob is a good person. mary is a good person. who is the best? are you a good person? bob is the best?'; //all words: $found = str_word_count(strtolower($str),1); //get all words with occurance of more then 1 $counts = array_count_values($found); $repeated = array_keys(array_filter($counts,function($a){return $a > 1;})); //begin results with the groups of 1 word. $results = $repeated; while($word = array_shift($found)){ if(!in_array($word,$repeated)) continue; $additions = array(); while($add = array_shift($found)){ if(!in_array($add,$repeated)) break; $additions[] = $add; $count = preg_match_all('/'.preg_quote($word).'\W+'.implode('\W+',$additions).'/si',$str,$matches); if($count > 1){ $newmatch = $word.' '.implode(' ',$additions); if(!in_array($newmatch,$results)) $results[] = $newmatch; } else { break; } } if(!empty($additions)) array_splice($found,0,0,$additions); } var_dump($results); 

Урожайность:

 array(17) { [0]=> string(3) "bob" [1]=> string(2) "is" [2]=> string(1) "a" [3]=> string(4) "good" [4]=> string(6) "person" [5]=> string(3) "the" [6]=> string(4) "best" [7]=> string(6) "bob is" [8]=> string(4) "is a" [9]=> string(9) "is a good" [10]=> string(16) "is a good person" [11]=> string(6) "a good" [12]=> string(13) "a good person" [13]=> string(11) "good person" [14]=> string(6) "is the" [15]=> string(11) "is the best" [16]=> string(8) "the best" } 

не можете ли вы просто добавить двойные слова в массив $ wordstats?

 $str = 'bob is a good person. mary is a good person. who is the best? are you a good person? bob is the best?'; function repeated($str) { $str=trim($str); $str=ereg_replace('[[:space:]]+', ' ',$str); $words=explode(' ',$str); $lastWord = ''; foreach($words as $w) { $wordstats[($w)]++; //skip the first loop because that is the only time it should be blank. if($lastWord!=''){ $wordstats[$lastWord.' '.$w]++; } $lastWord = $w; } foreach($wordstats as $k=>$v) { if($v>=2) { print "$k"." , "; } } } 

Я не тестировал это, но он должен работать, потому что он использует ту же технику, которую вы используете.