to be continued ~とあるプログラマーの実験的開発日誌~ -12ページ目

to be continued ~とあるプログラマーの実験的開発日誌~

WEBデザイナー兼プログラマーである管理人が日々のトラブル解決に向けて奮闘する開発日誌。

前回はクッキーを有効利用する一例として、
現在時刻をクッキーに書き込むスクリプトと、
書き込んだクッキーの内容を取得するスクリプトを紹介した。
しかし、これは当然ながらブラウザ側でクッキーが有効になっている前提である。


もちろん、クッキーを有効にするかどうかは訪問者の自由で無理強いをすることはできない。
ただし、クッキーの有効無効で移動ページを振り分けることはできるので、
クッキーが無効の場合は警告ページに移動してもらうというのも一つの手である。


これにはJavaScriptを利用する。


<script language="JavaScript">
if(navigator.cookieEnabled == false)
{
document.location = "移動させたいページアドレス";
}
</script>


クッキーが無効であれば、指定したページにジャンプするというスクリプトだ。
HTMLの<HEAD>~</HEAD>の間に記述する。
中にはクッキーが無効になっていることに気づいていない人もいるだろうから、
ブラウザの設定の仕方などを移動先に記載しておけばより効果があるだろう。
最も、これもJavaScriptが無効になっていれば意味がない。


というわけで、次回はクッキーもJavaScriptも無効の場合の対処法に触れる。

CGIやホームページを制作していると、
クッキーを有効に活用したくなる場合があるだろう。
例えば掲示板などで連続した投稿を禁止するために、
クッキーに投稿時間を書き込むなどだ。
Perlで記述すると、こんな感じになると思う。


#Perlでクッキーに現在時刻を書き込むサブルーチン
sub setcookie
{
my ($sec,$min,$hour,$mday,$mon,$year2,$wday) = gmtime(time + クッキーの保存日数*24*60*60);
#現在時刻からクッキー保存日数経過日時を秒数にして、gmtimeの返り値にそれぞれ格納
my $timenow = time(); #現在時刻
$wday = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday];
$mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon];
$gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",$wday,$mday,$mon,$year2+1900,$hour,$min,$sec);
#曜日と月をクッキーの期日形式に変換 sprintfは指定した書式指定文字に変換する関数
print "Set-Cookie: クッキーに付ける任意のタイトル=$timenow; expires=$gmt\n";
}


当然ながら書き込んだクッキーは読み込まなければ意味がないので、
そのためのスクリプトは次のように記述すれば良いだろう。


#Perlでクッキーに書き込んだ内容を読み込むサブルーチン
sub getcookie
{
my ($getcookies,@pairs,$name,$value,%DUMMY);
$getcookies = $ENV{"HTTP_COOKIE"};
#HTTP_COOKIEはブラウザからクッキーを受け取る環境変数
@pairs = split(/;/, $getcookies);
#取得したクッキーを「;」で分解して配列に格納
foreach (@pairs)
{
($name, $value) = split(/=/);
$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
$name =~ s/\s//g;
$DUMMY{$name} = $value;
}
#クッキーを格納した配列をforeachで一つずつ読み込みながら、読みやすい形に変換してさらにハッシュに格納している
$timenow = $DUMMY{"書き込む際に付けたクッキーのタイトル"});
#ハッシュのキーと書き込み時に付けたタイトルが一致するものを変数に格納している
}


もちろん、現在時刻でなくてもURLやパスワードなど自由に応用できる。


ただし、これはブラウザの設定でクッキーが有効になっていなければ機能しない。
そこで次回はブラウザの設定でクッキーを無効にしている場合の対処について考えてみよう。

入力したURLからHTMLを取得して、

必要な情報を抽出・加工し、

それをフォームに表示するというスクリプトを作成。

さらに、ここからは手作業で表示された内容をコピーして、

別の場所に貼り付けることを行わなければならない。


スクリプト自体は問題なくできたのだが、

フォームの内容をいちいちドラッグしてコピーするのは面倒なので、

ボタン一つでクリップボードにコピーするJavaScriptを実装してみた。


#フォーム側
<form name="formname">
<textarea name="textname" cols="40" rows="20">
ここにコピーしたい内容が表示される
</textarea><br>
<input type="button" value="コピーする" onClick="copy()">
</form>


#JavaScript側
<script language="JavaScript">
<!--
function copy() {
obj = document.formname.textname.createTextRange();
obj.execCommand("Copy");
alert("コピーしました。");
}
//-->
</script>


こんな感じ。


ところが、である。

IEでは問題なく動作するのだが、operaでは動かない。

どうやらIE以外のブラウザでは対応していないようだ。

まあ、IEを使うか、ドラッグしてコピーすれば済む話なのだが、

なんとなく悔しいので、別の方法を試してみる。

コピーできないのなら、せめてドラックする手間を省きたい。

そこでクリック一発で内容をすべて選択できるJavaScriptを試してみる。


#フォーム側
<form name="formname">
<textarea name="textname" cols="40" rows="20" onClick="select()">
フォームエリアをクリックするとすべて選択した状態になる
</textarea>
</form>


#JavaScript側
<script language="JavaScript">
<!--
function select() {
document.formname.textname.select();
}
//-->
</script>


こちらの方はoperaでも上手く動作した。

ボタン一つでコピーするのに比べれば一手間余分にかかるが、

それでも随分と効率的になった。


前回は取得したHTMLソースからタグを取り除くTipsを紹介したが、

今回はソース内の空白(スペース)を取り除く正規表現を紹介しよう。


$strに対象となる文字列が入っているとして、


$str =~ s/[\s ]+//g;


これで半角スペースやタブ、そして全角の空白を削除している。

表題通りです(笑)。


要するに取得したHTMLソースから"<"で始まり">"で終わる文字列を

すべて削除するためのコードです。


$htmにHTMLソースが取得済とする


$html =~ s/<.*?>//g;


これで取得したソースからタグはすべて取り除かれました。