プロが教える店舗&オフィスのセキュリティ対策術

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 ) )
{
...
}

というところから悩んでいます。

どなたかアドバイスをいただけないでしょうか。
お願いします。

A 回答 (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";
}
?>
    • good
    • 0
この回答へのお礼

preg_match_all("/([a-zA-Z]+)/",$story,$match);

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

回答ありがとうございました。

お礼日時:2007/04/12 22:04

$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";
}

こんな感じでいかがでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/04/12 21:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!