Yahooのメールサーバに接続しメールを取得、メール本文に特定の語句が含まれているか調べたいのですが、うまく行かず悩んでいます。
SJIS文字コードが原因なんでしょうか?
かなり長い文章になるので、お暇でしたらご教授下さい。
PHP Version 5.2.5です。
以下のプログラムでの問題点です。
<?php
$mb=imap_open("{pop.mail.yahoo.co.jp:110/pop3}INBOX","ID","pass")
or die("メールボックスを開けません<br>");
$i=4;//メール番号
//imap_fetchbody、mb_convert_encodingで取得した変数<$body_sjis>と比較する為、メール本文を変数<$mail_honbun>としてファイル内に定義。
$mail_honbun="次のことはを感じで、書きなさい。(すべて)手へんの漢字です。 「正解」はこのあとすぐ。仕上げの湾カールが決まるのは:エッセンシャルダメージケア新発売";
$body=imap_fetchbody($mb,$i,1,FT_PEEK);//本文取得
$body_sjis=mb_convert_encoding($body,"SJIS","auto");//SJISに変換
echo("$body_sjis<br><br><br>");
echo("[mail_honbunの場合]<br>");
if(preg_match("/次の.+書きなさい。/",$mail_honbun,$temp))//OK
echo("$temp[0]<br>");
else echo("NOT MATCH<br>");
if(preg_match("/次の.+正解/",$mail_honbun,$temp))//OK
echo("$temp[0]<br>");
else echo("NOT MATCH<br>");
if(preg_match("/エッセンシャル/",$mail_honbun,$temp))//OK
echo("$temp[0]<br>");
else echo("NOT MATCH<br>");
if(preg_match("/ダメージ/",$mail_honbun,$temp))//NG 何故ダメージはマッチしない?
echo("$temp[0]<br>");
else echo("NOT MATCH<br>");
echo("---------------------------------------<br>");
echo("[body_sjisの場合]<br>");
if(preg_match("/次の.+書きなさい。/",$body_sjis,$temp))//OK
echo("$temp[0]<br>");
else echo("NOT MATCH<br>");
if(preg_match("/書き.+正解/",$body_sjis,$temp))//NG 。を超えるとマッチしない
echo("$temp[0]<br>");
else echo("NOT MATCH<br>");
if(preg_match("/エッセンシャル/",$body_sjis,$temp))//OK エッセンシャルはOK
echo("$temp[0]<br>");
else echo("NOT MATCH<br>");
if(preg_match("/ダメージ/",$body_sjis,$temp))//NG ダメージがNG、何故?
echo("$temp[0]<br>");
else echo("NOT MATCH<br>");
?>
## 結果 ########################################################
[mail_honbunの場合]
次のことはを感じで、書きなさい。
次のことはを感じで、書きなさい。(すべて)手へんの漢字です。 「正解
エッセンシャル
NOT MATCH
---------------------------------------
[body_sjisの場合]
次のことはを感じで、書きなさい。
NOT MATCH
エッセンシャル
NOT MATCH
#################################################################
問題点<$mail_honbun>の場合
マッチするカタカナと、しないカタカナがある事。(エッセンシャルがマッチして、ダメージがマッチしない事)
問題点<$body_sjis>の場合
。を超えるとマッチしない事。
マッチするカタカナと、しないカタカナがある事。(エッセンシャルがマッチして、ダメージがマッチしない事)
自分で何が問題なのか、何を知らないのかがはっきりしません。
文字コードSJISを使わない方がいいのでしょうか?
参考になる事や、調べたら解決しそうなキーワードがあれば教えて下さい。宜しくお願いします。
ファイル"php.ini"の設定
mbstring.language = Japanese
mbstring.internal_encoding = SJIS
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII
お礼
ありがとうございます。 preg_matchがSJISに対応していない事すら知りませんでした。 UTF-8でもいいんですが、SJISの文字列を扱ってみたいので、もう少し調べてみたいと思います。
補足
preg_matchではなく、mb_ereg()を使ったら上手くいきました。 if(mb_ereg("文字列",$body_sjis,$match)) echo("$match[0]<br>");