![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
アクセス端末によって見え方を変えさせるため、条件節ifで =~ を使って分岐させているのですが、ユーザーエージェントがあまりにも多く、コードが長くなりすぎ制作に支障が出てきています
100%完璧に分岐させるところまでは求めていないため(アクセスの95%程度うまく分けられればいいかと思ってます)、たとえばスマホの場合はiPhoneとかAndroid、PCの場合はMSIEなど極力共通の部分を見つけてまとめてはいますが、それでも携帯、スマホ、PCと分けると非常に多くなり、
if(($ENV{'HTTP_USER_AGENT'} =~ /MSIE/) || ($ENV{'HTTP_USER_AGENT'} =~ /Firefox/)){}
など比較の片方は同じなのに同じことを何度も書く必要があり、非効率かつ強烈に長くなってしまい何とかまとめられないかと格闘しています
たとえば別で
$os_pc = "MSIE,Firefox";
$os_mb = "DoCoMo,KDDI";
など別でまとめて、
if($ENV{'HTTP_USER_AGENT'} =~ /$os_pcの,で分解したそれぞれの文字列と比較/){
PCと判定
}elsif($ENV{'HTTP_USER_AGENT'} =~ /$os_mbの,で分解したそれぞれの文字列と比較/){
携帯と判定
}
といったように、スマートに条件分岐させられないかと模索中ですが、=~ で別で用意したデータを,で分解してそれぞれと比べるとかできないでしょうか。
=~での比較ではなく、他の方法でもかまいませんので、ぜひお知恵をお貸しください。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
端末タイプの表を作って繰り返しの中で判定してはどうでしょうか。
use strict;
use warnings;
use Encode;
use utf8;
my %agent_type = (
qr/msie/i => 'pc',
qr/firefox/i => 'pc',
qr/docomo/i => '携帯',
qr/kddi/i => '携帯',
);
my $ua = $ENV{'HTTP_USER_AGENT'};
my $ua_type = "その他";
foreach my $key ( keys %agent_type ) {
if ( $ua =~ $key ) {
$ua_type = $agent_type{$key};
last;
}
}
print Encode::encode( 'utf8', $ua_type ), "\n";
ハッシュで作った表だと、上から順に比較されるわけではないので、比較パターンとする文字列はユニークにしないといけません。
回答ありがとうございます
確かに表にしてforeachで比較すると別でまとめられてすっきりします。
ただ、「比較パターンとする文字列はユニークに」のユニークとはどういう意味でしょうか?
補足頂けますとありがたいです
No.4
- 回答日時:
> ただ、「比較パターンとする文字列はユニークに」のユニークとは
> どういう意味でしょうか
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.1
Mozilla/5.0 (Windows NT 6.0; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
のようなユーザエージェントがあるとき、
if ($ENV{'HTTP_USER_AGENT'} =~ /MSIE/) {
}
elsif ($ENV{'HTTP_USER_AGENT'} =~ /Mozilla/) {
}
...
のようにするときは、比較順序が決まっているので Firefox が最初の条件に一致することはありません。
しかし、keys で取り出したハッシュのキーはどういう順序になるかわからないため、上の例の2番目の比較が先に行われ、どちらも同じブラウザと判定されてしまうかもしれません。
これを避けるために、どんな順序で比較されてもよいよう、区別したいユーザエージェントだけに一致するようなパターンを指定する必要があります。
回答ありがとうございます。
「唯一無二」という意味でのユニークだったのですね、ありがとうございました
(ユニークという意味は人によって違う意味で使われますし、プログラミング用語の中での専門用語なのかなとも考えていて分かりませんでした)
確かに仰る通りハッシュはどの順番で格納されるか分からないので、ユーザーエージェントをまとめる時に問題になりますね
特にSafariで今悩んでます
ありがとうございました
No.1
- 回答日時:
単純に正規表現をちゃんと使うのではダメなのですか?
if ($ENV{'HTTP_USER_AGENT'} =~ /(MSIE|Firefox)/) {
PCと判定
} elsif ($ENV{'HTTP_USER_AGENT'} =~ /(DoCoMo|KDDI/) {
携帯と判定
}
という具合で。
早速の回答ありがとうございます
確かに|ですれば少しスリムになりますが、それでもかなり比べるものが多いのであれこれ書き並べるとモニター上で何行にもなるため、できればMSIEとかKDDIとかといったものを別のところに一括してまとめて、この条件節のところではもっとシンプルにできないかと考えています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Windows 10 Windows11についての質問ー3。 2 2022/12/13 14:58
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 11:02
- 統計学 統計学、エクセルがわかりません!解答と詳しい解説をお願いします! (1)それぞれの地域別に記述統計量 9 2022/08/21 16:30
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- 電子マネー・電子決済 最近のスマホの決済に関しておしえてください。 7 2022/05/01 16:11
- 統計学 一変量分析(度数分布表)は、結果をもとに特に検定せずに断定してもよいですか? 7 2022/11/24 23:20
- 高校 方程式の証明 5 2022/05/12 09:29
- 画像編集・動画編集・音楽編集 【急】【Zbrush】3DCG初心者です。ノートPCでのZbrush動作環境につきまして 1 2023/08/19 17:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlで Right関数に近い処理を...
-
パイソンエラーについて
-
splitの逆の処理
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
エクセルで数値を全角文字(カ...
-
VBA EXCEL あるセルの中の一...
-
EXCELからCSVにすると余計なカ...
-
「何とかで始まり、何とかで終...
-
VBA 置換文字がみつからない時
-
文字コードの%E3%80%とは何です...
-
マクロを使ってフォルダー内に...
-
csvデータ ダブルクォーテ...
-
COBOLでの全角文字の判定をした...
-
住宅にカナを入力する際に丁目...
-
C#で、テキストボックスの入力...
-
データにカンマが入ったCSVデー...
-
[VBA][Excel]クリップボードか...
-
IEからEdgeへの移行に伴うIMEの...
-
スペースで区切られた氏名から...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Malformed UTF-8 character
-
Perlで Right関数に近い処理を...
-
splitの逆の処理
-
パイソンエラーについて
-
日本語文字列の指定長(byte)切出し
-
特定の文字列をHTMLタグに変換...
-
完全一致のデータだけを検索で...
-
何度も出現する文字列AAのうち...
-
VBA split(文字列, ★) ★←複数...
-
数字を文字列に変換し短縮化する
-
プログラミング HSPの変数につ...
-
perlで文字列を短く(圧縮)し...
-
特定文字列の抽出
-
ファイルから文字列を読み出し...
-
カートの送料設定を2個まで1個...
-
外部ファイルに「漢字(かんじ...
-
正規表現での文字の抜き出し
-
リストデータの検索でのエラー...
-
メールヘッダのMIMEエンコード...
-
Perlの文字列置換について
おすすめ情報