携帯サイトのmailtoを端末ごとに書き換える関数
携帯サイトでのmailtoの書き方はキャリアによってそれぞれ違う。
それをアクセスしてきた端末ごとに書き換えるPHPの関数です。
mailtoのsubjectとbodyの内容を日本語で書いておけばオッケー。
ただし改行とか%とか&は誤作動の原因になるのでURLエンコードは必要です。
| 置き換え前 | 置き換え後 |
|---|---|
| 改行 | %0D%0A |
| % | %25 |
| & | %26 |
| ? | %3F |
| " | %22 |
(それ以外は日本語)
<?php
/* ================================
* mailto4mobile
* mailto4mobilesub
*
* @create 2009-04-02
* @author pentan
* @url http://pentan.info/
*
* Copyright (c) 2009 pentan.info All Rights Reserved.
* 著作権表示部分の変更削除は禁止です
* ================================
*/
function mailto4mobile ($body){
return preg_replace_callback(
"/<a [^>]*href=\"mailto:[^\"]+\"[^>]*>/iUs",
create_function('$matches','return mailto4mobilesub($matches[0]);'),
$body
);
}
function mailto4mobilesub($a_tag){
$emailto="";
$emailcc="";
$emailbcc="";
$emailsubject="";
$emailbody="";
if(preg_match("/href=\"mailto:([^\"]*)\"/is",$a_tag,$match)){
$mailto=trim($match[1]);
}else{
return $a_tag;
}
$mailto=htmlspecialchars_decode($mailto);
if(preg_match("/^([^?\"]+)\?/i",$mailto."?",$match)){
$emailto=urldecode(trim($match[1]));
}
if(preg_match("/(&|\?)cc=([^&]+)&/i",$mailto."&",$match)){
$emailcc=urldecode(trim($match[2]));
}
if(preg_match("/(&|\?)bcc=([^&]+)&/i",$mailto."&",$match)){
$emailbcc=urldecode(trim($match[2]));
}
if(preg_match("/(&|\?)subject=([^&]+)&/is",$mailto."&",$match)){
$emailsubject=trim($match[2]);
}
if(preg_match("/(&|\?)body=([^&]+)&/is",$mailto."&",$match)){
$emailbody=trim($match[2]);
}
if(str_replace("%","",$emailsubject)==urlencode(str_replace("%","",$emailsubject))
&& str_replace("%","",$emailbody)==urlencode(str_replace("%","",$emailbody))){
return $a_tag;
}
$emailsubject=urldecode($emailsubject);
$emailbody=urldecode($emailbody);
$agent = $_SERVER['HTTP_USER_AGENT'];
if (preg_match("/^(SoftBank|Vodafone)/", $agent)) {
$emailsubject=mb_convert_encoding($emailsubject,"UTF-8","SJIS-win");
$emailbody=mb_convert_encoding($emailbody,"UTF-8","SJIS-win");
$emailsubject=rawurlencode($emailsubject);
$emailbody=rawurlencode($emailbody);
$mailto="";
if($emailcc)$mailto.=($mailto?'&':'?')."cc=".$emailcc;
if($emailbcc)$mailto.=($mailto?'&':'?')."bcc=".$emailbcc;
if($emailsubject)$mailto.=($mailto?'&':'?')."subject=".$emailsubject;
if($emailbody)$mailto.=($mailto?'&':'?')."body=".$emailbody;
$mailto="mailto:".$emailto.$mailto;
} else if (preg_match("/^J-PHONE\/3\.0/", $agent)) {
$mailto="";
if($emailbody)$mailto.="\" mailbody=\"".htmlspecialchars($emailbody);
$mailto="mailto:".$emailto.$mailto;
} else if (preg_match("/^J-PHONE\/4\.1\/J-SA51/", $agent)) {
$emailsubject=htmlspecialchars($emailsubject);
$emailbody=htmlspecialchars($emailbody);
$mailto="";
if($emailcc)$mailto.=($mailto?'&':'?')."cc=".$emailcc;
if($emailbcc)$mailto.=($mailto?'&':'?')."bcc=".$emailbcc;
if($emailsubject)$mailto.=($mailto?'&':'?')."subject=".$emailsubject;
if($emailbody)$mailto.="\" mailbody=\"".$emailbody;
$mailto="mailto:".$emailto.$mailto;
} else if (preg_match("/^J-PHONE\/4\./", $agent)) {
$mailto="mailto:?\" mailbody=\"".htmlspecialchars($emailbody);
$emailbody=htmlspecialchars($emailbody);
$mailto="";
if($emailcc)$mailto.=($mailto?'&':'?')."cc=".$emailcc;
if($emailbcc)$mailto.=($mailto?'&':'?')."bcc=".$emailbcc;
if($emailbody)$mailto.="\" mailbody=\"".$emailbody;
$mailto="mailto:".$emailto.$mailto;
} else if (preg_match("/^J-PHONE/", $agent)) {
$emailsubject=urlencode($emailsubject);
$emailbody=htmlspecialchars($emailbody);
$mailto="";
if($emailcc)$mailto.=($mailto?'&':'?')."cc=".$emailcc;
if($emailbcc)$mailto.=($mailto?'&':'?')."bcc=".$emailbcc;
if($emailsubject)$mailto.=($mailto?'&':'?')."subject=".$emailsubject;
if($emailbody)$mailto.="\" mailbody=\"".$emailbody;
$mailto="mailto:".$emailto.$mailto;
}else{
$emailsubject=urlencode($emailsubject);
$emailbody=urlencode($emailbody);
$mailto="";
if($emailcc)$mailto.=($mailto?'&':'?')."cc=".$emailcc;
if($emailbcc)$mailto.=($mailto?'&':'?')."bcc=".$emailbcc;
if($emailsubject)$mailto.=($mailto?'&':'?')."subject=".$emailsubject;
if($emailbody)$mailto.=($mailto?'&':'?')."body=".$emailbody;
$mailto="mailto:".$emailto.$mailto;
}
return preg_replace("/href=\"[^\"]+\"/is",'href="'.$mailto.'"',$a_tag);
}
?>
Smartyで使うときはoutputfilterに入れてしまうとよい。
$smarty->register_outputfilter('mailto4mobile');
関連記事
- 電話機の数字ボタンの右下にある「#」は、シャープではありません
- 個体識別番号通知の設定URL
- ドメイン指定受信設定のURL
- Googleなどのサーチエンジンに携帯版サイトを認識させる方法
- Net_UserAgent_Mobile 携帯判別PEARパッケージの使い方と注意点
- ユーザーエージェントからのキャリア、世代判別
- 携帯用クローラーのIPアドレスとユーザーエージェント
- 携帯電話番号の割り振り表 電話番号からキャリア・地域がわかります
- すべての端末で画像表示を同じにする方法
- FireMobileSimulator パソコンで携帯サイトを検証する
- 携帯電話番号の変遷
- 携帯サイトでのmailtoの使い方
- mailto本文での改行 ドコモのN、Pで送信に失敗します
- PCからデコメールを送るときの仕様
- <docomo>タグ、<au>タグ、<softbank>タグの使用例
- キャリア・クローラーのIP・ユーザーエージェント一覧
- 役に立つかもしれないリンク集
- 裏コマンド(スペシャルモード)
- バッテリーの製造番号 製造の年月がわかります
- 位置情報・GPS情報の取得方法
- 携帯ドメイン一覧 携帯電話キャリア PHSキャリア
- 個体識別情報・UIDの取得方法
- 絵文字一覧 Softbankモバイル(Yahoo!ケータイ)
- 絵文字一覧 Docomo(iモード)
- 絵文字一覧 au(KDDI EZweb)
- auでインラインFLASH
- PHP
- インクルードパスを設定する方法
- Twitter APIを使用する (Twitterアプリケーション登録)
- JISコードでstrlenの文字数が合わない(目視の文字数とstrlenの文字数が異なる)
- Drupal(ドルーパル)
スポンサーリンク





