kyoneco’s blog

教育、数学、統計といったテーマについて考えていきます

正規表現 第二章 テキストからHTMLへの変換

2.3.6 テキストからHTMLへの変換

プレーンテキストをHTMLに変換したい

巨大文字列(テキスト全体が1つの大きな文字列)をつくりたい

undef $/;
$text = <>;
 
 

&,<,>をHTMLエンコーディングである&anp; , &lt; , &gt;へ変換したい

$text =~ s/&/&amp;/g;
 

段落を<p>で区切りたい

空行があいだにあれば段落の区切り
空行を見分けたい
↓^$は論理行の行頭と行末ではない
拡張行アンカーマッチモードをつかう
$text =~ s/^$/<p>/mg;
空行に空白文字があるとこれでは動作しないことがある
「^ *$」や「^[ \t\r]*$」を使う
 
空白を除いて空っぽの行の範囲をみつけたい
「^\s*$」を使うと連続した空行でも全体に1回でマッチする
 
 

メールアドレスを認識してmailtoリンクに変換したい

$text =~ s/\b(username regex\@hostname regex\b/<a href=“mailto:$1”>$1<\/a>/g;
 

ユーザー名とホスト名のマッチを正規表現で表したい

\w+\@\w+(\.\w+)+
 
↓ピリオドやダッシュがはいることがあるのでそれに対応させたい
\w+から\w[-.\w]*にする
 
↓最後の要素になるものを具体的にリストにして並べる
\w+(\.\w+)*\.(com|edu|info)
 
↓\wは適切でないことがあるのでホスト名につかわれる文字種を指定したい i修飾子付き
[-a-z0-9]+(\.[-a-z0-9+])*\.(com|edu|info)
 
$text =~s{
\b
#アドレスを$1にキャプチャする
(
usename regex
\@
hostname regex
)
\b
}{<a href=“mailto:$1”>$1</a>}gix;
 
・x修飾子:ほとんどの空白が無視される。#を先頭におくコメントがかけるようになる
Perlでは区切り子を自由に選べる。/のかわりに{}が用いることができる。

 

メモ

プレーンテキストをHTMLに変換する実用よりの例で学ぶ節です。メールアドレスの正規表現は厳密に行おうとするとかなり大変ですが、練習の題材に沿う範囲で正規表現として表していく構成です。ときどき新しい方法がでてきますが(x修飾子や区切り子の選択、拡張行アンカーマッチモード)、たいていはこれまで学んできたことで理解できます。