2013年6月26日水曜日

正規表現で独自フォーマットのテキストからhtmlを吐き出す(PHP)

Wikiを編集する時のように、フォーマットを決めたテキストからHTMLを吐き出せたら色々出来そうだったので作ってみました。が、無駄に時間がかかったわりに微妙な出来です。
まずテキストのフォーマットを決めます、使った事のあるWikiをパクってアスタリスクを行頭につけると見出しタグになる、とします。1つならH1要素、2つならH2要素です。また、リンクタグもそれっぽくフォーマットを決めます。今回標的のなるテキストは以下です。
*H1要素にしたい
**H2要素にしたい
文書にしたい!

*H1要素にしたい

**H2要素にしたい

文書2[text:"リンクになりたい",url:"http://blog.t-lab.cs.teu.ac.jp/"]

文書3にしたい!
文書4EOFで終了したい
欲望の塊のようなテキストです。これをPHPのpreg_replace関数によって正規表現によるゴリ押しでHTMLに生成します。
$html = file_get_contents('./test.txt'); //欲望の塊を読み込む

$html =preg_replace('/^\*{2}(.+)(\n|$)+/m',"

$1

\n",$html); //H2タグの生成 $html =preg_replace('/^\*(.+)(\n|$)+/m',"

$1

\n",$html); //H1タグの生成 $html =preg_replace('/^((?!<).*?)(\n|$)+/m',"$1
\n",$html); //Pタグの生成 $html =preg_replace('/\[text:\"(.*)\",url:\"(.*)\"\]/m',"$1",$html); //Aタグの生成 print $html;
正規表現部分がわかりにくいと思いますが、大体このような感じになりました。正規表現はまだまだ慣れていないので、全然キッチリしてないです。実行順で優先順位を付けてかなり誤魔化している部分が多いです。特にH1とH2の差はアスタリスクの個数だけなので、このままの構文ではアスタリスクが多い方を優先しないとおかしな事になってしまいます。こういった所は改善点だと思いました。パズルみたいでノータリンの自分には難しかったです。
このPHPにテキストを投げ入れると以下のようなHTMLが出来上がりました。

H1要素にしたい

H2要素にしたい

文書にしたい!

H1要素にしたい

H2要素にしたい

文書2リンクになりたい
文書3にしたい!
文書4EOFで終了したい
幾多のタグの暴走を経て(ただの失敗)、なんとか形になりました。これに宣言等のタグをくっつければHTMLファイルの出来上がりです。本来は複数改行されたらPタグで閉じる、というようにしたかったのですが(文書3と文書4が一つのPタグ内にまとまるように)複数行にまたがる正規表現はまだ自分には難しく、上手く行きませんでした。HTMLを書く時に「一部文書で改行コード入れるのがめんどくさい」と思っていただけに、ここが上手く実現できなかったのは悔しい所でした。
完全に"やってみたかっただけ"なのですが、自分でフォーマットを決めてメモを取ったり、文書を書いておくとこのような形でどこかで使えるかも・・・と思いました。今回作った物の紹介は以上になります。

0 件のコメント:

コメントを投稿