- ベストアンサー
PHP 文字の出現回数
textareaからユーザーにインプットしてもらった文章(英語)を PHPを使って読み取り、 単語の出現した回数をarrayにいれるプログラムを作ります。 たとえば、 I am a student. I am a XX university student. という文章をユーザーがインプットしたら、 I:2 am:2 a:2 studemt:2 XX:1 university :1 と値を返します。 Perlでは 読み取った文章(ここでは文字列)を $storyとすると、 foreach( split(/\s+/,$story) ) { $m{$_}++; } でその後、 連想配列のキーと値を順に表示していけばよいとわかります。 PHPではこれをどう表現すればよいでしょうか? foreach( explode(" ", $story ) ) { ... } というところから悩んでいます。 どなたかアドバイスをいただけないでしょうか。 お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1さんのだと語尾のピリオドとかもひろってますね。 セパレータは必ずしもスペースではないので正規表現で拾う方が よいかもしれません。 また、単語を拾うとなると大文字、小文字で別単語となるとやや 問題になりそうなので大文字を強制的に小文字にすると合理的です。 それと、以下の例のようにアポストロフィーとかハイフンとか 入った場合、どうしたいのか仕様をはっきりしておかないと 後々意に反する結果となる可能性があります。 <?php $story = "I am a student. I am a XX university student. I'm a second-year student!! "; preg_match_all("/([a-zA-Z]+)/",$story,$match); foreach($match[1] as $val){ $count[strtolower($val)]++; } foreach($count as $key=>$val){ print "$key:$val<br>\n"; } ?>
その他の回答 (1)
- calltella
- ベストアンサー率49% (317/635)
$story = "I am a student. I am a XX university student."; foreach( split(" ",$story) as $a ){ $m[$a]++; } while ($a = each($m)) { echo "$a[0] -> $a[1]<br>\n"; } こんな感じでいかがでしょうか?
お礼
回答ありがとうございます。 とてもPerlの記述と似ていますね。 原理もわかりましたし、PHPへの理解も深まりました。
お礼
preg_match_all("/([a-zA-Z]+)/",$story,$match); の部分は全く思いつかなかったです。自分にとっては 目からうろこ でした。[ .,!?]の正規表現を用いて、split することばかり考えてました。 ただ[a-zA-Z]+ だと don'tなどの短縮形が拾えなくなるので [a-zA-Z']+で使わせていただいてます。 回答ありがとうございました。