ようこそゲストさん

Magical Diary, beta version

メッセージ欄

2007年8月の日記

[Perl] メールアドレスのチェック・解析

2007/08/13 23:57 HIRATA Yasuyuki

メールアドレスが正しい形式であるか確認する

入力されたメールアドレスの形式を確認するため、

if(not $mail =~ /^[a-z0-9]+@[a-z0-9-]+(?:\.[a-z0-9-]+)+$/) {
  die "invalid address";
}

のようなコードを書くべきではない。メールアドレスというものはあなたが考えている以上に複雑で、このような単純なコードでチェックし切ることはできない。車輪の再発明をせず、次のように Email::Valid を利用しよう。これはDNSのMXレコードのチェックなども可能である。

use Email::Valid;
if(not Email::Valid->address(-address => $mail,
                             -mxcheck => 1,
                             -fqdn => 1) {
  die "invalid address";
}

RFC 822 (2822) 形式のアドレスをパースする

メールのヘッダ中に含まれるアドレスはさまざまな形式を取るため、これを自力で解析するのは骨が折れる。これもモジュールを利用することで車輪の再発明を避けることができる。以下は Email::Address を利用した例である。(同様のモジュールとしては Mail::Address があり、若干インターフェイスが異なる。)

use Email::Address;
my @addrs = Email::Address->parse(
  'HIRATA Yasuyuki <yasu@example.com>, ' .
  'yasu@example.net (HIRATA Yasuyuki), ' .
  '"sakura tan haahaa"@example.org' # *VALID* RFC 2822 address
);
foreach (@addrs) {
  print $_->address, "\n";
}

[Apache] mod_rewrite の小技

2007/08/13 0:22 HIRATA Yasuyuki

ループ処理

mod_rewrite でループ処理を行うには、[N] (next) フラグを利用する。たとえば、/hoge/1/bar/2/baz/3/ を /hoge/index.cgi?foo=1&bar=2&baz=3 としたい (その際、パラメータの個数が不定) 場合、下記の通り記述する。"QSA" (query string append) フラグは、書き換え後の QUERY_STRING 部分のみ "追加" の扱いとする。

RewriteEngine on
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 9
# Rule 1:
RewriteRule ^(/hoge/.*/)([^/]+)/([^/]+)/$ $1?$2=$3&path=$1 [QSA,N]
# Rule 2:
RewriteRule ^/hoge/([^/]+)/$ /hoge/index.cgi?foo=$1 [QSA]

処理の流れは以下の通り。

  1. path = "/hoge/1/bar/2/baz/3/", QUERY_STRING="" → Rule 1
  2. path = "/hoge/1/bar/2/", QUERY_STRING="baz=3" → Rule 1
  3. path = "/hoge/1/", QUERY_STRING="bar=2&baz=3" → Rule 2
  4. path = "/hoge/index.cgi", QUERY_STRING="foo=1&bar=2&baz=3"

日本語のファイル名に見せかけてSEO

ファイル名はSEOを考慮すると日本語 (UTF-8) で付けた方が良いが、日本語のファイル名はUnix上で扱いづらいという欠点がある。mod_rewrite を利用することで URL path中の日本語文字列を任意のファイル名 (英数字) にマッピングすることができる。

  1. httpd.conf に以下の行を追加
    RewriteEngine on
    RewriteLog /var/log/httpd/rewrite.log
    RewriteLogLevel 9
    RewriteMap foo_kanji_ascii txt:/www/etc/map/naiyo_kanji_ascii.txt
    RewriteRule ^/(.*[^!-~]+.*) /www/htdocs/${naiyo_kanji_ascii:$1}.html
    
  2. /www/etc/map/naiyo_kanji_ascii.txt に UTF-8 で以下の内容を記載。
    萌え	moe
    
  3. httpd の再起動。
  4. http://www.example.com/%E8%90%8C%E3%81%88 へアクセスすると /www/htdocs/moe.html の内容が表示される。

大規模に書き換えを行う場合には、性能上の観点からテキストファイルではなくDBMファイルで用意することが望ましい。

© 2007 HIRATA Yasuyuki <yasu@asuka.net>, all rights reserved