@kyanny's blog

My thoughts, my life. Views/opinions are my own.

MT形式のエクスポート用に出力をエスケープする

MT 形式はブログデータのエクスポート/バックアップにおける業界標準といっていいが、フィールドの区切り文字(デリミタ)に "-----\n" と "--------\n" を使っている(五つまたは八つのハイフンの連続に改行文字がついたもの)。これは正規表現で表すと qr/^(-{8})(\n)$/ と qr/^(-{5})(\n)$/ にマッチする。

ブログの本文とかコメントの本文とか、なんでもいいけど MT 形式でエクスポートしたときにデータが複数行になり得るフィールドでは、データ内にデリミタと全く同じパターンが現れる可能性がある(複数行を許可していないフィールド、例えば TITLE: などは、行頭にハイフンが現れないので上記の正規表現にはマッチしない)。

デリミタと同じパターンがデータの途中で出現してしまうと、パーサにそこがデータの終端だと誤認識されてしまい、データが欠損する。これを防ぐためには、複数行になり得るフィールドのデータをエスケープ処理し、上記の正規表現にマッチしないように書き換えてしまえば良い。

というわけで前置きが長くなりましたがそういうコードを書いたので貼っておきます。


追記

コメントとかトラックバックをいただいたので。

たつをさんのはてブで指摘された文字クラス [\r\n|\r|\n] については、俺が盛大に勘違いしてるのかな・・・たぶんそうだと思います。すいません。正規表現勉強しなおします。。改行文字で行ごとに split したいってことが伝わってくれれば・・・。あとバックスラッシュが yen 記号になっちゃうのは Mac のせいです。

トラックバックをいただいた記事で、エスケープ処理で <> をつける点にツッコミをもらいましたが、半角スペースだとぱっと見に変化がわかりづらいのであえて変な記号をくっつけてみました。実際には半角スペースをくっつけると思います。あと、エスケープ後の文字列と同じパターンが元々あった場合に戻せないという点ですが、 MT 形式じたいがそういう点で欠陥がある不完全な仕様だと思っているので別に厳密に元通りに戻さなくてもいいんじゃないかなーと思っています(というか戻せないような・・・)。業界標準とかいたのは、たいていのブログサービスでインポートとエクスポートには MT 形式のファイルを採用しているので、デファクトスタンダードという意味でつかいました。 RFC みたいなもので定められているという意味ではないです。