fslasht (3370) の日記

2004 年 02 月 04 日
午後 08:53

/.日記のHTMLソースをPukiWiki形式に変換

STATUS: 故障中

 /.の日記をベースにしてPukiWikiなどのページを作ろうとすると
改行の「~」入れたり、タグをPukiWiki形式に変換したりといろいろ
めんどくさいので、nisejournalに変換機能をつけてみました。

Pseudo Slashdot Journal あるいは 偽/.日記 ver.1.04 (開発版)
http://dokokano.net/~fslasht/misc/nisejournal/nisejournal.php
※このURLはまさに開発中のテスト環境です。
  コードを書き換えてるときはちゃんと動かないと思います。

 だいたい正規表現で置換とか出来ました。
 ソースはこんな感じ。

$str = 日記のHTMLソース
$str = preg_replace( "/\r<br>/i","~\n",$str);
$str = preg_replace( "/\<BR>/","~\n",$str);

$arrPat = array();
$arrReplace = array();

$arrPat[]="/\<b\>/i";           $arrReplace[]="''";
$arrPat[]="/\<\/b\>/i";         $arrReplace[]="''";
$arrPat[]="/\<em\>/i";          $arrReplace[]="''";
$arrPat[]="/\<\/em\>/i";        $arrReplace[]="''";
$arrPat[]="/\<strong\>/i";      $arrReplace[]="''";
$arrPat[]="/\<\/strong\>/i";    $arrReplace[]="''";
$arrPat[]="/\<i\>/i";           $arrReplace[]="'''";
$arrPat[]="/\<\/i\>/i";         $arrReplace[]="'''";

$arrPat[]="/\<p\>/i";           $arrReplace[]="";
$arrPat[]="/\<\/p\>/i";         $arrReplace[]="";
$arrPat[]="/\<tt\>/i";          $arrReplace[]="";
$arrPat[]="/\<\/tt\>/i";        $arrReplace[]="";

$arrPat[]='/\<a[^\>]*href\=["|\']([^\>]*?)["|\'][^\>]*\>([^\<]*?)\<\/a\>/ise';
$arrReplace[]="'[['.preg_replace('/~\n/','','$2').':$1]]'";

$arrPat[]="/\<\/ol\>/i";        $arrReplace[]="</ol>\n";        // 予備改行
$arrPat[]="/\<\/ul\>/i";        $arrReplace[]="</ul>\n";        // 予備改行
$arrPat[]='/\<ol\>(.*?)\<\/ol\>/sie';
$arrReplace[]="preg_replace('/\<li\>/i','-','$1')";
$arrPat[]='/\<ul\>(.*?)\<\/ul\>/sie';
$arrReplace[]="preg_replace('/\<li\>/i','+','$1')";

$arrPat[]="/\<blockquote\>/i";  $arrReplace[]="<blockquote>\n"; // 予備改行
$arrPat[]='/\<blockquote\>(.*?)\<\/blockquote\>/sie';
$arrReplace[]="preg_replace(array('/\n/','/~/'),array('\n ',''),'$1')";

$str = preg_replace($arrPat , $arrReplace , $str );

このページを変換すると
http://srad.jp/journal.pl?op=display&uid=3370&id=191435
こんな感じになります。
http://www.dokokano.net/~fukaya/pukiwikitest/pukiwiki.php?test%2Fhtmlconv

 いまのところ制限事項としては、以下のような感じです
・複数のテキストリンクは1行にまとまる(PukiWikiの制限)
・リストを1行にまとめで書いてしまうと正しく変換できない
 例) <ol><li>リストb1<li>リストb2<li>リストb3</ol>
・<blockquote>した最後の行に余計な「~」が付いてしまう
・PukiWikiのマークアップと同一の文字が日記の文章に入っていた場合は、適用されてしまう。

 ほかにもちょっとおかしなところがありますが、そこは手で
修正するとしても、かなり効率よく変換できると思います。
 なんかもうわけわからなくなってますが、正規表現直せるところがあったらご指摘いただけると助かります。

 preg_replaceのすごいところは、/e修飾子をつけると置換先に
PHPのコードを書くことができることです。
 マッチしたそれぞれの文字列にたいして、文字列処理関数を
呼び出したりできるわけです。
 preg_replaceを入れ子で呼ぶこともできてかなり強力。
 でも、入れ子で呼んだ preg_replaceの中の正規表現で
括弧で括られたパターンにマッチしたテキストはどうやって
使ったらいいのでしょう? $1とかってやったら、おおもとの
preg_replaceのテキストと置換されちゃいそうだし。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Stableって古いって意味だっけ? -- Debian初級

処理中...