bodyタグ内にある日本語のみをカウントしたいのですが、どうすればいいでしょうか?

最近になってphpをはじめたばかりの初心者なのですが、phpでカウントすることは
可能でしょうか?

英数字はカウントしたくありません。
あらゆるサイトで日本語のみをカウントしたいので、
URLを入力する(例えばhttp://www.yahoo.co.jp

www.yahoo.co.jp/以下すべての階層も調べる

検索結果を表示する(入力したサイト内の日本語文字数は○○○文字です、みたいな)

対象となるサイトが100ファイル以上あれば「できません」と返すのがいいと思いますが
その仕組みもわかりません。

教えて下さい。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/02/01 00:37:06
  • 終了:2009/02/04 18:37:11

回答(1件)

id:zeck_kiraboshi No.1

zeck回答回数2ベストアンサー獲得回数12009/02/01 02:31:29

ポイント60pt
  1. まずは<body>~<body>の中の文字列を取得して、配列に格納します。
  2. 次に、配列の中から英数字を空文字に置き換えます (正規表現などを使うと良いと思います。)
  3. 最後に、残った配列の文字数を数えます。

これでいかがでしょうか?

正規表現の使い方は参考URLを見てください。

http://always-pg.com/php/std_rd/regex/preg_replace.html

  • id:tobeoscontinue
    >bodyタグ内にある日本語のみをカウントしたい
    htmlファイルは文字コードとしてJIS,Shift_JIS,EUC,UTF-8などが使われています。
    各コードごとに処理を考えてもいいのですが面倒なので一つのコードに変換することにします。
    (コード変換は表せる字数などの違いから文字化けするリスクがあります)
    まずhtmlファイルが何の文字コードで書かれているか知る必要がありますが行儀のいいhtmlファイルでは

    <meta http-equiv="content-type" content="text/html; charset=utf-8">

    で知ることができます。しかし行儀の悪いhtmlファイルではこの記述が無い場合もあるのでmb_detect_encodingで調べる必要があります。
    文字コードがわかればmb_convert_encodingでコード変換します。(処理がしやすいようにUTF-8にするとして進めます。文字化けのリスクは高いですが)

    $html = '<html><head>'.
    '<meta http-equiv="content-type" content="text/html; charset=utf-8">'.
    '</head><body>'.
    '<a href="http://hatena.ne.jp" alt="はてな">'.
    '<a href="/top" alt="トップ">'.
    '<a href="../aaa" alt="上">'.
    '<p>1aA?2cDいチ、漢字?。</p>'.
    '</body></html>';

    preg_match('/<body.*?>(.*?)<\/body>/m',$html, $m);
    print_r ($m);
    ---------------------------------------------------------------
    Array
    (
    [0] => <body><a href="http://hatena.ne.jp" alt="はてな"><a href="/top" alt="トップ"><a href="../aaa" alt="上"><p>1aA?2cDいチ、漢字?。</p></body>
    [1] => <a href="http://hatena.ne.jp" alt="はてな"><a href="/top" alt="トップ"><a href="../aaa" alt="上"><p>1aA?2cDいチ、漢字?。</p>
    )

    preg_matchなどの正規表現を使うことでbodyタグ内は取り出すことができます。
    タグに含まれる文字は含まないのであればpreg_replaceを使って削除します。

    $data = preg_replace('/<.+?>/m','',$m[1]); // 必要なら<...>を削除します
    print_r ($data);
    ---------------------------------------------------------------
    1aA?2cDいチ、漢字?。

    次に英数字のようなascii文字を削除します。UTF-8ではascii文字以外は0x80以上になるので0x00-0x7fまでを無条件に削除します。

    $data = preg_replace('/[\x00-\x7f]/','',$data); // $dataはUTF-8である必要がある。
    print_r ($data);
    ---------------------------------------------------------------
    2cDいチ、漢字?。

    文字数のカウントはmb_strlenで可能ですがその時の文字エンコーディングはmb_internal_encodingが使われるのであらかじめ設定しておかないと正しい結果を返しません。

    mb_internal_encoding('UTF-8');
    $count = mb_strlen($data);
    print_r ($count);
    ---------------------------------------------------------------
    10

    まだ希望する値にならないと思いますが更に記号、括弧、省略記号、単位記号、点、丸数字など必要のないものを削除することでvfr6822さんの考える『日本語のみをカウント』することになっていくと思います。
    [http://ash.jp/code/unitbl21.htm:title=Unicode対応 文字コード表]
    全角の英数字を削除してみます。マルチバイト文字はpreg_replaceでは認識しないのでmb_ereg_replaceを使います。mb_ereg_replaceを使うには更にmb_regex_encodingで指定する必要があります。

    mb_regex_encoding(mb_internal_encoding());

    $data = mb_ereg_replace('[0-9A-Za-z]', '', $data);
    $count = mb_strlen($data);
    echo $data.'('.$count.")\n";
    ---------------------------------------------------------------
    いチ、漢字?。(7)

    >www.yahoo.co.jp/以下すべての階層も調べる
    これは結構厄介です。httpプロトコルでは階層を調べる機能はありません(私の知る限り)。サイトによっては一覧を表示している所もあります。またftpなら可能です。が結局は外から中のことは解かりません。そう見えるだけです。
    似た機能を実現する方法として<a>タグのhrefを調べることが可能です。htmlファイルを解釈するためにDOM(php5オンリー。php4ならDOM XMLを使うようです)を使います。

    $dom = new DOMDocument();
    $dom->loadHTML($html);
    foreach ($dom->getElementsByTagName('a') as $node) {
    echo $node->getAttribute('href')."\n";
    }
    ---------------------------------------------------------------
    http://hatena.ne.jp
    /top
    ../aaa

    loadHTML($html)でdomの中に格納してgetElementsByTagName('a')で全てのaタグを取り出します。それぞれのhref属性の値を取り出すことができます。がこの中には他のサイトのurlがあったり、相対パスや絶対パスだったりするので、更に処理を要します。

    >phpでカウントすることは可能でしょうか?
    おおまかには可能だが厳密になると結構面倒というところでしょうか。
    まずは一つのhtmlファイルから日本語のみをカウントするものを作ってみて、
    次にすべての階層も調べるに挑戦してみてはどうでしょうか

    htmlファイルを入手する
    file_get_contentsでリモートにあるファイルでも入手できますがセキュリティーによってはできないようにしている場合があります。
    その場合はcurlを使って入手するといいでしょう

    function url_get_contents($url) {
    if (ini_get('allow_url_fopen'))
    return file_get_contents($url);

    $ch = curl_init($url);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    $contents = curl_exec($ch);
    curl_close($ch);
    return $contents;
    }
  • id:vfr6822
    tobeoscontinueさん、ありがとうございました!
    細かなご提示頂いてありがとうございます!
    回答を締め切ってしまったのですが、どうやったらポイントをお渡ししたら
    よいのでしょうか・・・初心者ですいません。。。
  • id:tobeoscontinue
    ポイント受け取りました。ありがとうございます。
    終了していたのに逆にお手間をとらせてしまってすいません。(^^;
  • id:vfr6822
    tobeoscontinue さん
    追加で2点ほどご質問があります。

    ---------------------------------
    '<meta http-equiv="content-type" content="text/html; charset=utf-8">'.
    '</head><body>'.
    '<a href="http://hatena.ne.jp" alt="はてな">'.
    '<a href="/top" alt="トップ">'.
    '<a href="../aaa" alt="上">'.
    '<p>1aA?2cDいチ、漢字?。</p>'.
    '</body></html>';
    ---------------------------------
    こちらの一番左側にあります「’」は何の意味を持つのでしょうか?

    また、
    ---------------------------------
    「2cDいチ、漢字?」
    ---------------------------------
    こちらは文字化けしてるのでしょうか??
    1aA?2cDいチ、漢字?なのでしょうか???


「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません