携帯サイトの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(ドルーパル)
スポンサーリンク