質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

4532閲覧

substr_count 関数(全角文字の出現回数がカウントされません)

GikaiWatcher

総合スコア8

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/03/14 02:20

$str = file_get_contents('http://www.yahoo.co.jp/');
まずは、file_get_contents 関数を使って Yahoo! を読み込みます。

結果:きちんと表示される。

次に substr_count 関数を使って指定したキーワードが出てくる回数を調べます。
echo substr_count($str,"ニュース");
echo ":";
echo substr_count($str,"1");
echo ":";

結果:0:211

というように、半角文字をキーワードに指定した場合は、回数を数えてくれるのですが、全角文字を指定すると、ホームページ内で明らかに使われているはずのキーワードであっても回数が0(ゼロ)になってしまいます。

これはどうしてでしょうか? ちなみに、mb_substr_count 関数を使っても同じ結果でした。

おわかりになる方、どうぞご教示くださいませ。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

mb_substr_count($hoge, $hage, "UTF-8"); かな? 使ったことありませんが。

頭にmb_プレフィックスがついてないstring系関数は1バイト文字専用です。
UTF-8は1バイト文字についてはASCIIコードと互換するので、
substr_countでも1バイト文字については正しく動作しています。

文字コードが指定されないと内部エンコードが利用されるのですが、
検出できないということは、内部エンコーディングがShift-JISとかになっていませんでしょうか?

投稿2015/03/14 03:11

編集2015/03/14 03:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GikaiWatcher

2015/03/14 03:52

ご教示ありがとうございます。教えていただいた通りにしてみましたが、やはりダメでした。 $str = "テストとテスト"; echo substr_count($str,"テスト"); 結果:2 $str = "テストとテスト"; echo mb_substr_count($str,"テスト"); 結果:2 上記のように変数に直接値を指定した場合は、期待通りの結果が得られました。 引き続きのご教示をお願いいたします。
hotta

2015/03/14 04:37

@lucker さんのコメント、ちゃんと読んでます? mb_substr_count() の第三引数に 'UTF-8' を指定してみてください。 以下のスクリプトで、手元では正しく動いています。 ```lang-php <?php $str = file_get_contents('http://www.yahoo.co.jp/'); print_r($str); echo '出現回数=' . mb_substr_count($str, 'ニュース', 'UTF-8') . "\n"; ```
hotta

2015/03/14 04:38

```lang-php ~ ``` は無視してください。コメント欄では効かないみたい。
退会済みユーザー

退会済みユーザー

2015/03/14 04:41

あなたのコードそのままで、こちらでは正しく動作します。 そうするとまず考えられるのは、 php.iniでmb_string関数が有効になっていない事なのですが、 echo phpinfo(); で、mbstringの項が Multibyte Support enabled になっているか確認できますか?
退会済みユーザー

退会済みユーザー

2015/03/14 04:43

>hottaさん 多分、extension=php_mbstring.dll(.so) がコメントアウトされているんじゃないかと思うんですよね。
hotta

2015/03/14 04:47

mb_string が無効の場合、undefined function になるのではと思いますが。
退会済みユーザー

退会済みユーザー

2015/03/14 04:54

なるほど。display_errorがOffになっていて、エラーが表示されないだけかと思いましたが、0が返るとおっしゃってますから、違いますね、確かに。
退会済みユーザー

退会済みユーザー

2015/03/14 04:58

ああ、すいません、私のコメントの後のやつ、エンコード指定してなかったんですね… よく見ていませんでした...m(_ _)m
hotta

2015/03/14 05:17

ちなみに拡張モジュールが無効の場合、存在しない関数を呼ぶことになるので致命的エラー扱いになり、display_errors が Off でも "undifined function" が表示されて、そこで実行が中断されると思います。 hotta@net-newbie:~/temp$ cat c.php <?php ini_set('display_erros', 0); arienai_kansuu(); echo "OK\n"; hotta@net-newbie:~/temp$ php c.php PHP Fatal error: Call to undefined function arienai_kansuu() in /home/hotta/temp/c.php on line 3 http://php.net/manual/ja/errorfunc.configuration.php#ini.display-errors
退会済みユーザー

退会済みユーザー

2015/03/14 05:22

> display_errors が Off でも "undifined function" が表示されて、そこで実行が中断されると思います。 PHP5.6・php.iniでdisplay_erros=Offでのテストでは、 エラーは何も表示されません。 もちろん、そこで中断されているはずですが。
hotta

2015/03/14 05:37

手元の環境では表示されるようです。 Stack trace も付いてきました。 m-hotta@egypt:~$ cat a.php <?php echo 'PHP_VERSION = '. PHP_VERSION . "\n"; ini_set('display_erros', 0); arienai_kansuu(); echo "OK\n"; m-hotta@egypt:~$ php a.php PHP_VERSION = 5.6.6 PHP Fatal error: Call to undefined function arienai_kansuu() in /home/m-hotta/a.php on line 4 PHP Stack trace: PHP 1. {main}() /home/m-hotta/a.php:0
GikaiWatcher

2015/03/14 06:37

luckerさん、hottaさん、ありがとうございます。 mb_substr_count($hoge, $hage, "UTF-8"); や <?php $str = file_get_contents('http://www.yahoo.co.jp/'); print_r($str); echo '出現回数=' . mb_substr_count($str, 'ニュース', 'UTF-8') . "\n"; ?> で、実行してみました。やはり結果は「0」です。 一つ気になることが……。 出現回数=0 と表示されなければならないところ、 �o���????�0 と、文字化けして表示されます。 指定する文字コードが違うのかと'UTF-8'の部分に EUC-JP, SJIS, auto と入れてみましたが、やはり文字化けした後に「0」と表示されます。 >echo phpinfo(); で、mbstringの項が >Multibyte Support enabled >になっているか確認できますか? 実行してみました。 Multibyte Support → enabled となっています。 >あなたのコードそのままで、こちらでは正しく動作します。 そうですよね。 文字コードの関係で変数内部に「ニュース」という語が存在しないので結果が「0」になるということでしょうか? 半角文字の場合は文字コードの影響を受けないので、正しい値が返るということですね。 ものすごい初心者ですいませんが、引き続きお願いいたします。
退会済みユーザー

退会済みユーザー

2015/03/14 06:42

> 一つ気になることが……。 > 出現回数=0 と表示されなければならないところ、 > �o���????�0 > と、文字化けして表示されます。 その直前に出力されている > $str = file_get_contents('http://www.yahoo.co.jp/'); > print_r($str); の$strの文字コードがUTF-8ではないからですね。 その文字コードをブラウザが識別してしまって、それで文字化けしているのだと思います。 だからmb_substr_countで識別できないんですね。 一体何がとれているんでしょう? echo mb_ditect_encoding($str); の結果は何でしょうか?
退会済みユーザー

退会済みユーザー

2015/03/14 07:02

申し訳ありません、どうもやはり内部エンコードが違うのかなと… echo mb_internal_encoding(); こっちを出力した方がよさそうですね。(こんがらがってきました…)
GikaiWatcher

2015/03/14 07:14

根気よくアドバイスをくださり、ありがとうございます。 「文字コード」がヒントになり、ようやく解決しました。 プログラムを書き終えてエディタで保存するときに、SJIS で保存しておりました。これを UTF-8 で保存し、アップロードしたところ、出現回数=2 と無事に表示されました。 また、mb_detect_encoding (); を実行したところ、UTF-8 と返ってきました。 「こうやって文字コードを調べるのね」と、いたく感心しているところです。 echo mb_internal_encoding(); は ISO-8859-1 でした。 混乱させてしまってごめんなさい。PHP からしばらく遠ざかっていたので、本当に初歩的なことを忘れておりました。これでもう間違わないと思います。 lucker さん、ありがとうございます。感謝いたします!\(^o^)/
退会済みユーザー

退会済みユーザー

2015/03/14 07:21

それはよかった。 こちらはどうやったら同じ現象を再現できるかと、いろいろ試していましたが、 お手上げでした。なるほどそういうケースでしたか。
GikaiWatcher

2015/03/14 07:27

はい(^_^; 本当にお手間を取らせてしまいました。 3日ほど悩んでいたのですが、 ここに書き込んでこんなに早く解決するとは思っていませんでした。 ありがとうございます。これからもよろしくお願いいたします。
guest

0

Web環境だと動きが違うのかなと思って、CentOS7+Apache-2.4.6+php-5.6.6の環境でテストしてみたら、興味深い結果になりました。

関数 arienai(); を呼ぶと、Web画面上は Internal Server Error 500 になりました。
apache の error_log を見てみると、

lang

1[Sat Mar 14 14:46:48.671545 2015] [:error] [pid 21098] [client 10.30.8.31:38907] PHP Fatal error: Call to undefined function arienai() in /var/www/html/phpinfo.php on line 3

が記録されていました。

本題の質問からは外れてしまったので、このへんにしておきます。
(すみません、間違えて「回答」に書いてしまいました。)

投稿2015/03/14 05:55

編集2015/03/14 05:58
hotta

総合スコア1613

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GikaiWatcher

2015/03/14 07:18

hotta さん、ありがとうございました。 lucker さんのお力添えにより、おかげ様で無事に解決いたしました。 hotta さんのアドヴァイスにもついていけるよう、さらに頑張りたいと思いますが、 道のりは遠そうです。今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問