• ベストアンサー

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 ) ) { ... } というところから悩んでいます。 どなたかアドバイスをいただけないでしょうか。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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"; } ?>

ilnmfay
質問者

お礼

preg_match_all("/([a-zA-Z]+)/",$story,$match); の部分は全く思いつかなかったです。自分にとっては 目からうろこ でした。[ .,!?]の正規表現を用いて、split することばかり考えてました。 ただ[a-zA-Z]+ だと don'tなどの短縮形が拾えなくなるので [a-zA-Z']+で使わせていただいてます。 回答ありがとうございました。

その他の回答 (1)

  • calltella
  • ベストアンサー率49% (317/635)
回答No.1

$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"; } こんな感じでいかがでしょうか?

ilnmfay
質問者

お礼

回答ありがとうございます。 とてもPerlの記述と似ていますね。 原理もわかりましたし、PHPへの理解も深まりました。

関連するQ&A