正規表現(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やメールアドレスを画面に出力する時は、エスケープしてから表示させる。