最終更新日:1999年 9月 5日(日)

Regular Expression


Perl の特徴の一つに正規表現が挙げられるでしょう。

正規表現は UNIX の世界では vi(ex) コマンド、awk コマンドなど 色々なコマンドに組み込まれていたり、 regcmp というライブラリになっていたりします。

これらのコマンドの正規表現と比べても Perl の正規表現は強力で、 うまく正規表現を使用すれば、 スクリプトのコーディング量が極端に減ることも少なくありません。

然し、正規表現と言っても、各コマンド毎に機能的な制限や方言があり、 別のところで覚えた正規表現のルールがそのまま適応できるかというと 多少問題があります。

そのため、Perl にどっぷりつかっているのでなければ、 微妙な部分は毎回確かめる必要が出てきます。

ここでは、Perl5 の正規表現に関してよく使われるスクリプトを紹介することにします。



目次


URL encode/decode する

# URL encode $string=~s/(\W)/sprintf("%%%02X",unpack("C",$1))/eg; # URL decode $string=~s/%([0-9a-f][0-9a-f])/pack("C",hex($1))/egi;

URL decode は通常 CGI で取得する HTTP_QUERY などで使用しますが、 csv ファイルなどに書出す場合、文字コードによって誤動作する可能性を避ける場合でも 有効かもしれません。(私ならカンマで区切らずにタブコードで区切りますが... f(^^;

quoted-printable に変換/逆変換 する

# encode $string=~s/=/=3D/g; $string=~s/\t$/=09/; $string=~s/ $/=20/; $string=~s/([^!-" \t])/&tohex($1)/eg; sub tohex{ my ($_)=@_; $_='='.unpack("H2",$_); tr/a-f/A-F/; return $_; } # decode $string=~s/=\r\n//g; $string=~s/=\n//g; $string=~s/=\r//g; $string=~s/=([0-9a-z]{2})/pack("C",hex($1))/gei;

quoted-printable は CGI メールなどで日本語を扱う場合に使用される程度で、 現実的にこれを使用するケースは少ないと思います。

メールアドレスをチェックする

unless($mail_addr=~/^[\w\-+\.]+\@[\w\-+\.]+$/i){ error_addr($mail_addr); }

テストするメールアドレスは名前を含まない単純なアドレス表記です。 もし、完全な形のメールアドレスを対象にする場合は RFC821 に基づいて加工する必要があります。

RFC821からの抜粋
タグを無効にする

$strings=~s/&/&amp;/g; $strings=~s/</&lt;/g; $strings=~s/>/&gt;/g; $strings=~s/"/&quot;/g;

これは、掲示板などで入力された文字をブラウザで表示する際、 ブラウザが誤ってタグと解釈しないようにします。

URL( http )を展開する

my ( $protocol, # プロトコル( http 固定 ) $host, # ホスト名 $port, # ポート番号 $path, # パス $file, # ファイル $fragment # フラグ又は CGI の GET データ ); if($url=~m@^http://([^:/]*)?(:(\d+))?(/([^/]+/)*)?([^/#\?]*)?([#\?](.*))?$@){ ( $protocol, $host, $port, $path, $file, $fragment )=( 'http', $1, $3, $4, $6, $7 ); }

与える URL はフルパス表現でなければなりません。
$fragment が CGI か ドキュメント内の位置かは $fragment の最初の文字で判断できます。

RFC2068からの抜粋


戻る (C)Copyright 1999 ShinSoft. All rights reserved. メール