スレッド表示 | フラット表示〕 全トピック 920 件中 258 番目 次≫ ≪前

ダブルクォーテーションがチェック・置換できません。

created: 2006-03-31 17:12 | modified: 2006-04-04 19:26 | reply: 9

[3008] ダブルクォーテーションがチェック・置換できません。

user: pira | created: 2006-03-31 17:12
今、受信メールからメールアドレスを取得するプログラムを制作しているのですが、docomoのメールアドレスで、@前に「.(ドット)」があるからなのか、
""nantoka."@docomo.ne.jp"となってしまいます。
ですから「"」を取り払おうと

mb_ereg_replace('"',"",$mailfrom)
mb_ereg_replace('\"',"",$mailfrom)
mb_ereg_replace("\"","",$mailfrom)
mb_ereg_replace('"',"",$mailfrom,"p")

このようにいろいろとやってみたのですが、出来ません。

ですから一度あるのかと思い下記のように正規表現でチェックしても引っかかりませんでした。

if(eregi('\"',$mailfrom)){
echo "\"はあるよ。";
}else}
  echo "\"はないよ。";
}

"が何故あるのかもわからないし、"が引っかからない理由もわかりません。
何が原因でしょうか、お願いします教えてください。

他になにか解決に必要な情報がありましたら教えてください。
reply: 3009 返信 編集 削除

[3009] Re. ダブルクォーテーションがチェック・置換できません。

user: ゆうじ | created: 2006-03-31 20:47
こんばんわ。

次のコードで試したところ
マッチしましたし置き換えも行われました。
Win2000、 Apache1.3.34 + PHP4.4.2

$mailfrom にマルチバイト文字は含まれてますか?
もし無ければ、str_replace の方が適切だと思います。
あるならば、mb_regex_encoding で適切な文字コードを設定し
$mailfrom の文字コードをあわせてあげるといかがでしょうか。

<?php
$mailfrom = '"hoge."@docomo.ne.jp';
echo $mailfrom, '<br>';

if (eregi('\"', $mailfrom)) {
echo 'match<br>';
} else {
echo 'none<br>';
}

$mailfrom = mb_ereg_replace('\"', '', $mailfrom);

echo $mailfrom;
?>

結果
"hoge."@docomo.ne.jp
match
hoge.@docomo.ne.jp
Parent: 3008  reply: 3014 返信 編集 削除

[3014] Re. Re.ダブルクォーテーションがチェック・置換できません。

user: pira | created: 2006-04-03 11:37
ゆうじさん

返事が遅くなってすいません。
同じようにやってみましたができませんでした。
そこで実際にやってりるスクリプトを公開します。

以下のようになります。


<?php

$mbox = imap_open("{" . $mailserver . ":110/POP3}",$id ,$pass );



$head = imap_header($mbox, $i);
$mailfrom = htmlspecialchars(mb_decode_mimeheader($head->fromaddress));
$get_mailad = addr_search($mailfrom);


/* メールアドレスを抽出する */
function addr_search($addr) {
if (eregi('\"', $addr)) {
echo 'match<br>';
}else{
echo 'none<br>';
}
$addr = mb_ereg_replace('\"', '', $addr);
var_dump($addr);
if (mb_eregi("[-!#$%&\'*+\\./0-9A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+", $addr, $fromreg)) {
var_dump($fromreg);
return $fromreg[0];
} else {
echo '抽出できませんでした。<BR>';
return false;
}
}

?>

このようになっております。
ちなみにエンコードは'ASCII'と表示されました。
Parent: 3009  reply: 3015 返信 編集 削除

[3015] Re.Re. Re.ダブルクォーテーションがチェック・置換できません。

user: pira | created: 2006-04-03 11:46
連投すいません。
結果は下記のようになります。

none
string(42) ""l-.-lv.*******."@docomo.ne.jp" 抽出できませんでした。

よろしくお願いいたします。
Parent: 3014  reply: 3016 3017 返信 編集 削除

[3016] Re.Re.Re. Re.ダブルクォーテーションがチェック・置換できません。

user: ach | created: 2006-04-03 18:32
'\"'は'"'で良いのではないでしょうか

ただ、この問題は自分も以前遭遇していて、正規表現やら置換やらではどうにも対処できなかった記憶があります。
もしかするとmagic_quotesが関連しているのかもしれません。

function remove_char($str, $char) {
if (strlen($char) != 1) return FALSE;
#echo "try to remove $char";//デバッグ用
$size = strlen($str);
$newStr = "";
for ($i=0; $i < $size; $i++) {
if ($str{$i} != $char) $newStr .= $str{$i};
}
return $newStr;
}
とかどうでしょう。2バイト文字は扱えませんが……
これで置換できなければその文字はなにか変です。
echo remove_char('"hoge"hoge','"');
でうちの環境ではうまく行きました。
Parent: 3015  reply: 3018 返信 編集 削除

[3018] Re.Re.Re.Re. Re.ダブルクォーテーションがチェック・置換できません。

user: pira | created: 2006-04-04 17:45
新しい情報ありがとうございます。
結果変わらずです。
magic_quotesをoffにしてやってみましたが変わりませんでした。
置換が出来ないって意味が解りません。
文字コードの裏側が何か存在するのですかね。
謎です。

"は実は2バイト文字だったり・・・。
表示は半角ですが・・・。
わけが解りません。
Parent: 3016  返信 編集 削除

[3017] "hoge.”@docomo.ne.jp

user: ゆうじ | created: 2006-04-03 22:40
以下のコード試したところ
@の前の”を取り除けましたよ。
ひとつひとつやれば抽出できるはずです。

<?php
$host = '{pop.****.com:143}';
$user = 'username';
$password = 'password';

$mbox = imap_open($host, $user, $password);
$count = imap_num_msg($mbox);

if ($count) {
for ($i=1; $i<=$count; $i++) {
$head = imap_headerinfo($mbox, $i);
$from = mb_decode_mimeheader($head->fromaddress);
// @ の前に " があれば、" を削除
if (eregi('"@', $from)) {
// str_replace でもいいかもね
$from = mb_ereg_replace('"', '', $from);
}
// ↓この$fromからならメルアド抽出できるのでは
echo $from, "<br>\n";
}
} else {
echo 'None message', "<br>\n";
}

imap_close($mbox);
?>
Parent: 3015  reply: 3019 返信 編集 削除

[3019] Re.

user: pira | created: 2006-04-04 17:49
"自体が無い様な動きをするんですよね。

if (eregi('"@', $from)) { 
$from = mb_ereg_replace('"', '', $from);
}else{ echo "だめだ。置換できない。";}

どう変えても「だめだ。置換できない。」になります。
やはり「”」は認識できない何かのコードなのでしょうか。
Parent: 3017  reply: 3020 返信 編集 削除

[3020] htmlspecialchars 他

user: ゆうじ | created: 2006-04-04 19:01
私の携帯がDocomoだったので、
一時的に .@docomo にアドレスを変更してからメールを送信し、
ローカルPC(Win2000+Apache1.3.34+PHP4.4.2)で
[3017] のコードを走らせ確認したのですが、
" は排除されました。

magic_quote_gpc の違いで
$head->fromaddress の値は変わりなかったので
影響はないようです。

正規表現のところで思い入れがあるようですが
原因はその前のように思いますので、
部分的にコードを使わず
[3017] のコードを丸々使ってお試しください。

それで、OKならコードに問題ありですので
var_dump()で上から順番に値チェック。
だめなら環境の違いに原因がある。
と言う具合に切り分けられます。

尚、PHPの出力を確認する際は、
ブラウザを通して見るのではなく
ソースを見るとブラウザならではの盲点に気付くものです。


$mailfrom = htmlspecialchars(mb_decode_mimeheader($head->fromaddress));

私が思うに↑の htmlspecialchars が原因で
" → " になってる気がするのですが
この htmlspecialchars は必要なのでしょうか?
Parent: 3019  reply: 3022 返信 編集 削除

[3022] Re.htmlspecialchars 他

user: pira | created: 2006-04-04 19:26
わざわざありがとうございました。
無事解決しました。ほんとありがとうございました。

$mailfrom = htmlspecialchars(mb_decode_mimeheader($head-fromaddress));

私が思うに↑の htmlspecialchars が原因で
" → $quot; になってる気がするのですが
この htmlspecialchars は必要なのでしょうか?

その通りでした。
他のキャリアでAUがこれをつかわないと文字化けをおこしていたので使用していたのですが、切り分けすることで対処しました。

これからはソースをちゃんと見てやっていきたいと思います。

長々とお付き合いいただきほんとにありがとうございました。
Parent: 3020  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 258 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑