正規表現(1)〜メールアドレスかどうか、URLかどうかをチェックする

とりあえずの更新をします。あとできれいに書き直しますー。

#正規表現はなるべく長くマッチしようとする

'<a>aaa</a><b>bbb</b><c>ccc</c>' =~ />(.+)</
$1 #=> 'aaa</a><b>bbb</b><c>ccc'

#最短一致=>+?もしくは*?を使用する。
'<a>aaa</a><b>bbb</b><c>ccc</c>' =~ />(.+?)</;#=>何かが1個以上連続したあとの一番最初に来る<にマッチさせる。
'<a>aaa</a><b>bbb</b><c>ccc</c>' =~ />(.*?)</

### 基本問題 ###
#$pid が 数字8桁である、というチェックをしてください。

$pid =~ /^\d{8}\z/;



#$abc が 'abc' または 'xyz' で終わっているかチェック

#パイプをつかった「または」の処理は確かに遅いが、何百個もの「または」があるときに気にしだす程度でよい遅さなので、あまり気にしなくてよい。
$abc =~ /(abc|xyz)\z/;



#$htm = qq(aaa<p>ぴぴぴ</p>bbb) から、<p>で囲まれた部分を取り出す

$htm =~ />(.*)</;



#$htm = qq(<a>aaa</a><p>ぴぴぴ</p><b>bbb</b>) から、<p>で囲まれた部分を取り出す

$htm =~ /<p>(.*?)</;


#$htm = qq(<a>aaa</a><p>ぴぴぴ<b>bbb</b></p>) から、<p>で囲まれた部分を取り出す

#スラッシュが正規表現処理の対象になっている時は、デリミタに/以外を使う。いちいち前に\やバックスラッシュを付けてエスケープするのが大変。
$htm =~ m%<p>(.*)</p>%;


#$htm = qq( 
#    <a>aaa</a><p>ぴぴぴ<b>bbb</b></p>
#    <a>aaa</a><p>ぷぷぷ</p>
#) から、最初に<p>で囲まれた部分を取り出す

#最長マッチの特性を押さえるために+?を使用する
$htm =~ /<p>(.+?)<\/p>/;

メールアドレスかどうかをチェックしてください

#my($a,$b) = split()
$htm =~ /^\w([\w\-^.]*\w)?@[\w\-.]+\z/;
##..のようにコンマが二つつながっているのもアウトな場合
###正規表現内でいじろうとすると大変なので、&&を使う
$htm =~ /^\w([\w\-^.]*\w)?@[\w\-.]+\z/ && !($htm =~ /\.\./)
$htm =~ /^\w([\w\-^.]*\w)?@[\w\-.]+\z/ && $htm !~ /\.\./

URLかどうかをチェックしてください

$htm =~ m(^https?://[\w\-.%/:#&=?]+\z);
##パラメータ付きかもしれない場合
$htm =~ m(^https?://[\w\-\.]+(:\d+)?[/\w\-\.]*(\?[\w\-\./%]*=[\w\-\./%]*(&[\w\-\./%]*=[\w\-\./%]*)*)?(#.*)?

#urlやメールアドレスは、厳しくしようとしたらいくらでもできるので切りがない
        #RCFで定義されている通りにしたとしても、そんな文字実際につかわれているのか
        #PCと携帯でメールアドレスに使える字が違う
        #厳しくしすぎたら、使えているメールアドレスなのに登録できない、などのクレームがくる場合がある
#上記のような懸念があるので、メアドチェックにはメアド形式チェックのモジュールを使う
#urlチェックの場合には、https://もしくはhttp://で始まっているかどうかだけチェックすればよい。
        #リンクチェック時には、LWPで2002番が返ってくるかをチェックする
        #ただし、warningレベルにしておくこと。リンク先のページが数日後等に用意される場合、テスト等が止まってしまうため。
#urlやメールアドレスを画面に出力する時は、エスケープしてから表示させる。